我有两个通用列表,一个名为“精选”,另一个名为“过滤”。
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 :(得分: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()