【问题标题】:Compare two generic lists and remove duplicates比较两个通用列表并删除重复项
【发布时间】:2012-07-09 13:05:42
【问题描述】:

我有两个通用列表,一个称为“精选”,另一个称为“过滤”。

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。

【问题讨论】:

  • 所以,Featured 应该完整显示,然后是 Filtered,但从 Featured 中删除的任何项目?
  • 看看:stackoverflow.com/a/2060093/100283。它不是 Linq,但它是比较两个对象的一种简单方法。
  • 你如何比较Contents,是什么让它们与众不同?
  • ContentID 属性是唯一的

标签: c# linq


【解决方案1】:

如果您定义了 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】:

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

    var singleList = Featured.Union(Filtered);
    

    这将返回所有Featured 项目,然后是所有不是FeaturedFiltered 项目。请注意,它会删除列表中的所有重复项 - 所以如果一个项目是Featured 两次,它只会出现一次

    但是,您确实需要能够比较 Content 的实例才能做到这一点,方法是添加EqualGetHashCode 的实现,或者提供一个@ 987654330@.

    【讨论】:

      【解决方案3】:

      假设两个列表中的对象展示者是实际相同的对象,您可以执行以下操作:

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

      更新

      或者,使用 Mahmoud Gamal 提到的 except 方法:

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

      【讨论】:

        猜你喜欢
        • 2011-04-05
        • 2022-01-25
        • 1970-01-01
        • 2014-12-16
        • 2013-02-02
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 2021-12-09
        相关资源
        最近更新 更多