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

6

我有两个通用列表,一个叫做“Featured”,另一个叫做“Filtered”。

List<Content> Featured = new List<Content>();
List<Content> Filtered = new List<Content>();

这两个都包含“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版本。

所以,“Featured”应该完整显示,然后是“Filtered”,但要删除任何来自“Featured”的项目? - Damien_The_Unbeliever
1
请查看:https://dev59.com/vHI95IYBdhLWcg3w_zQN#2060093。虽然不是 Linq,但这是一种比较两个对象的简单方法。 - Mark Kram
你如何比较“内容”,它们有什么独特之处? - Tim Schmelter
ContentID属性是唯一的。 - rf_wilson
3个回答

6
如果您定义了一个 IEqualityComparer,则可以使用 Union 方法: ```html 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();
    }

}

6
您需要使用LINQ方法Union,具体如下:
var singleList = Featured.Union(Filtered);

这将返回所有的 Featured 项目,接着是所有没有被标记为 FeaturedFiltered 项目。请注意它还会在列表内部删除任何重复项 - 因此,如果一个项目被标记为 Featured 两次,它只会显示一次。
然而,你需要能够比较 Content 实例才能做到这一点,可以通过添加 EqualGetHashCode 的实现或提供 IEqualityComparer 来实现。

2
假设两个列表中的 presenter 对象是实际相同的对象,您可以执行以下操作:
var totalList = Featured
    .Concat(Filtered.Where(f => !Featured.Contains(f)))
    .ToList()

更新

或者,按照Mahmoud Gamal提到的方法使用Except方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接