我有两个通用列表,一个名为"精选",另一个名为"过滤".
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.
如果您定义了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)
您正在寻找的LINQ方法Union,特别是
var singleList = Featured.Union(Filtered);
Run Code Online (Sandbox Code Playgroud)
这将返回所有Featured项目,然后是所有Filtered项目Featured.请注意,它会同时去除任何副本中的列表-所以,如果一个产品Featured的两倍,它只会出现一次.
但是,您需要能够比较实例,Content以便通过添加Equal和/ GetHashCode或通过提供实现来实现IEqualityComparer.