2012-07-09 76 views
6

我有两个通用列表,一个名为“Featured”,另一个名为“Filtered”。比较两个通用列表并删除重复项

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。

+0

因此,'精选'应该出现在整体,然后'过滤',但从'精选'的任何项目被删除? – 2012-07-09 13:08:09

+0

是的,这是正确的:) – 2012-07-09 13:08:44

+1

看看:http://stackoverflow.com/a/2060093/100283。它不是Linq,但它是比较两个对象的简单方法。 – 2012-07-09 13:09:12

回答

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

} 
2

假设对象在两个列表主持人是实际相同对象,您可以执行以下操作:

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

更新

或者,由马哈茂德·贾迈勒提到使用除方法:

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

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

var singleList = Featured.Union(Filtered); 

这将返回所有Featured项目,然后是所有不是FeaturedFiltered项目。请注意,它会删除任何重复一个清单 - 所以如果一个项目是Featured两次,它将只显示一次

你这样做,但是,需要能够比较Content例子,为了做到这一点,无论是通过在EqualGetHashCode实现增加或通过提供IEqualityComparer