如何使用LINQ查找和删除集合中的重复对象?

Ice*_*ind 7 .net c# linq collections duplicates

我有一个表示对象的简单类.它有5个属性(日期,2位小数,一个整数和一个字符串).我有一个派生类,派生自CollectionBase,它是一个容器类,用于从我的第一个类中保存多个对象.

我的问题是,我想删除重复的对象(例如,具有相同日期,相同小数,相同整数和相同字符串的对象).是否有可以编写的LINQ查询来查找和删除重复项?或者至少找到它们?

LBu*_*kin 11

您可以使用Distinct运算符删除重复项.

有两个重载 - 一个使用您的类型的默认相等比较器(对于自定义类型将调用该类型的Equals()方法).第二个允许您提供自己的相等比较器.它们都返回一个代表原始集的新序列,没有重复.这两个重载都没有实际修改你的初始集合 - 它们都返回一个排除重复项的新序列..

如果您只想找到重复项,可以使用GroupBy:

var groupsWithDups = list.GroupBy( x => new { A = x.A, B = x.B, ... }, x => x ) 
                         .Where( g => g.Count() > 1 );
Run Code Online (Sandbox Code Playgroud)

要从IList<>您可以执行的操作中删除重复项:

yourList.RemoveAll( yourList.Except( yourList.Distinct() ) );
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 5

如果您的简单类的使用Equals方式满足您的要求,那么您可以使用 Distinct 方法

var col = ...;
var noDupes = col.Distinct();
Run Code Online (Sandbox Code Playgroud)

如果没有,那么您将需要提供一个实例,以IEqualityComparer<T>您想要的方式比较值。例如(为简洁起见,忽略空问题)

public class MyTypeComparer : IEqualityComparer<MyType> {
  public bool Equals(MyType left, MyType right) {
    return left.Name == right.Name;
  }
  public int GetHashCode(MyType type) {
    return 42;
  }
}

var noDupes = col.Distinct(new MyTypeComparer());
Run Code Online (Sandbox Code Playgroud)

请注意,使用常量 forGetHashCode是有意为之。如果不了解有关语义的详细信息,MyType就不可能编写高效且正确的哈希函数。我使用了一个常量来代替高效的哈希函数,无论类型的语义如何,该常量都是正确的。

  • 优秀且最佳实践的答案 (2认同)