比较两个通用列表并删除重复项

时间:2012-07-09 13:05:43

标签: c# linq

我有两个通用列表,一个名为“精选”,另一个名为“过滤”。

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;
    }
}

出现在“已过滤”但出现在“精选”中的所有项目都需要从“已过滤”中删除。此外,两个列表将合并为一个通用列表,首先出现“精选”项目。

我知道我可以写几个foreach循环来做这个但是我不禁觉得必须有一个更优雅的方法使用LINQ。

我正在使用C#4.0。

3 个答案:

答案 0 :(得分: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();
    }

}

答案 1 :(得分:6)

您正在寻找LINQ方法Union,特别是

var singleList = Featured.Union(Filtered);

这将返回所有Featured项,然后返回非Filtered的所有Featured项。请注意,它删除列表中的所有重复项 - 因此,如果项目为Featured两次,则只会显示一次

但是,您需要能够比较 Content的实例才能执行此操作,方法是添加Equal和{{1}的实现}或提供GetHashCode

答案 2 :(得分:2)

假设两个列表中的对象演示者都是实际相同的对象,您可以执行以下操作:

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

<强>更新

或者,使用Mahmoud Gamal提到的Except方法:

var totalList = Featured
    .Concat(Filtered.Except(Featured))
    .ToList()