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

rf_*_*son 6 c# linq

我有两个通用列表,一个名为"精选",另一个名为"过滤".

List<Content> Featured = new List<Content>();
List<Content> Filtered = new List<Content>();
Run Code Online (Sandbox Code Playgroud)

两者都包含"内容"项,这些项是简单的类,如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我正在使用C#4.0.

D S*_*ley 6

如果您定义了IEqualityComparer,则可以使用以下Union方法:

List<Content> FeaturedAndFiltered = Featured.Union(Filtered, new MyContentComparer());
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)


Raw*_*ing 6

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

var singleList = Featured.Union(Filtered);
Run Code Online (Sandbox Code Playgroud)

这将返回所有Featured项目,然后是所有Filtered项目Featured.请注意,它会同时去除任何副本的列表-所以,如果一个产品Featured的两倍,它只会出现一次.

但是,您需要能够比较实例,Content以便通过添加Equal和/ GetHashCode或通过提供实现来实现IEqualityComparer.