6

私は2つの一般的なリストを持っています。1つは「注目」と呼ばれ、もう1つは「フィルター」と呼ばれます。

List<Content> Featured = new List<Content>();
List<Content> Filtered = new List<Content>();

どちらにも、次のような単純なクラスである「コンテンツ」アイテムが含まれています。

public class Content
{
    public long ContentID { get; set;}
    public string Title { get; set; }
    public string Url { get; set; }
    public string Image { get; set; }
    public string Teaser { get; set; }

    public Content(long contentId, string title, string url, string image, string teaser)
    {
        ContentID = contentId;
        Title = title;
        Url = url;
        Image = image;
    }
}

「フィルター済み」に表示されているが「注目」にも表示されているアイテムは、「フィルター済み」から削除する必要があります。さらに、両方のリストが1つの汎用リストに結合され、「注目」アイテムが最初に表示されます。

これを行うためにいくつかのforeachループを作成できることは知っていますが、LINQを使用するより洗練された方法が必要だと感じずにはいられません。

私はC#4.0を使用しています。

4

3 に答える 3

6

Union特にLINQメソッドを探しています

var singleList = Featured.Union(Filtered);

これにより、すべてのアイテムが返さFeaturedれ、その後Filteredにそうでなかったすべてのアイテムが返されますFeaturedリスト内の重複削除されることに注意してください。したがって、アイテムが2回ある場合、表示されるのは1回だけです。Featured

ただし、これを行うには、およびの実装を追加するか、を提供することにより、のインスタンスを比較できる必要があります。ContentEqualGetHashCodeIEqualityComparer

于 2012-07-09T13:11:48.530 に答える
6

IEqualityComparerを定義している場合は、次のUnionメソッドを使用できます。

List<Content> FeaturedAndFiltered = Featured.Union(Filtered, new MyContentComparer());

MyContentComparerの大まかな実装は次のようになります。

public class ContentEqualityComparer : IEqualityComparer<Content>
{

    public bool Equals(Content c1, Content c2)
    {
        return (c1.ContentID == c2.ContentID);
    }


    public int GetHashCode(Content c)
    {
        return c.ContentID.GetHashCode();
    }

}
于 2012-07-09T13:08:55.347 に答える
2

両方のリストのオブジェクトプレゼンターが実際に同じオブジェクトであると仮定すると、次のことができます。

var totalList = Featured
    .Concat(Filtered.Where(f => !Featured.Contains(f)))
    .ToList()

アップデート

または、MahmoudGamalが述べたExceptメソッドを使用します。

var totalList = Featured
    .Concat(Filtered.Except(Featured))
    .ToList()
于 2012-07-09T13:11:23.757 に答える