比较两个通用列表并删除重复项
问题描述:
我有两个通用列表,一个名为“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。
答
如果你有一个的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();
}
}
答
假设对象在两个列表主持人是实际相同对象,您可以执行以下操作:
var totalList = Featured
.Concat(Filtered.Where(f => !Featured.Contains(f)))
.ToList()
更新
或者,由马哈茂德·贾迈勒提到使用除方法:
var totalList = Featured
.Concat(Filtered.Except(Featured))
.ToList()
答
您正在寻找的LINQ方法Union
,特别是
var singleList = Featured.Union(Filtered);
这将返回所有Featured
项目,然后是所有不是Featured
的Filtered
项目。请注意,它会也删除任何重复内一个清单 - 所以如果一个项目是Featured
两次,它将只显示一次。
你这样做,但是,需要能够比较Content
例子,为了做到这一点,无论是通过在Equal
和GetHashCode
实现增加或通过提供IEqualityComparer
。
因此,'精选'应该出现在整体,然后'过滤',但从'精选'的任何项目被删除? – 2012-07-09 13:08:09
是的,这是正确的:) – 2012-07-09 13:08:44
看看:http://*.com/a/2060093/100283。它不是Linq,但它是比较两个对象的简单方法。 – 2012-07-09 13:09:12