C# list - 通过比较特定属性消除重复项

标签 c# linq list hashset

List<ClassA> newlist;
List<ClassA> oldlist;

ClassA 有 20 个不同的属性, 我要

  • 比较并从新列表中删除完全匹配的项目
  • 但是比较必须从 ClassA 中排除一些属性,因为值不相关
  • 我正在处理的记录集巨大(30 万到 40 万)。所以它必须高效

Linq ExceptIntersect 似乎不支持上述要求,而且速度似乎也很慢。 有什么建议可以实现这一目标吗?

最佳答案

您可以实现自己的自定义比较器

public class MyEqualityComparer: IEqualityComparer<ClassA> {
  public bool Equals(ClassA x, ClassA y) {
    if (Object.ReferenceEquals(x, y))
      return true;  
    else if ((null == x) || (null == y))
      return false;

    // Your custom comparison here (...has to exclude few properties from ClassA)  
    ... 
  }

  public int GetHashCode(ClassA obj) {
    if (null == obj)
      return 0;

    // Your custom hash code based on the included properties 
    ...
  }
}

并使用HashSet<ClassA>然后(我们想从 oldlist 中排除 newlist):

HashSet<ClassA> toExclude = new HashSet<ClassA>(
   oldlist, 
   new MyEqualityComparer());

newList.RemoveAll(item => toExclude.Conytains(item));

关于C# list - 通过比较特定属性消除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40994536/

相关文章:

c# - 从子类调用父类构造函数的正确方法

c# - 在母版页中声明 session 字典

c# - 如何从一个用户控件调用另一个用户控件的方法?

c# - Expand 在查询中做了什么?

c# - LINQ:根据属性比较两个列表并返回符合特定条件的项目

list - Lisp 两个列表,从每个列表中获取项目在一起

c# - 使用 C# 进行异地构建

.net - 比较两个列表以获取同时出现在两个列表中的对象

java - 通用列表的深拷贝

c# - 使用 LINQ 获取两个列表之间的差异