List<ClassA> newlist;
List<ClassA> oldlist;
ClassA
有20个不同的属性,
我想要:
- 比较并从新列表中删除完全匹配的项
- 但是比较必须排除
ClassA
中的一些属性,因为这些值不相关 - 我正在处理的记录集非常庞大(30万到40万)。所以它必须高效。
Linq的Except
或Intersect
似乎不支持上述要求,而且好像速度也很慢。
有什么建议可以实现这一点吗?
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
...
}
}
如果我们想要排除oldlist
从newlist
中,并使用HashSet<ClassA>
:
HashSet<ClassA> toExclude = new HashSet<ClassA>(
oldlist,
new MyEqualityComparer());
newList.RemoveAll(item => toExclude.Conytains(item));
MyEqualityComparer
只是一个用于比较两个 ClassA
实例是否相等的 自定义规则。 - Dmitry BychenkonewList.RemoveAll(item => ...)
,如果newList
可以表示为HashSet<ClassA>
,那么Except
将是一个很好的实现。 - Dmitry Bychenkopublic static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> seenKeys = new HashSet<TKey>();
foreach (TSource element in source)
if (seenKeys.Add(keySelector(element)))
yield return element;
}
.Distinct
。如果所有相关属性都匹配,则它们是相等的。将更快的类型比较放在前面(整数,布尔值等),慢一些的类型放在最后(字符串,复杂类型),因此在许多情况下,您会发现在采取重量级操作之前元素是不相等的。根据您的情况,最好实际上对每个对象的所有相关属性进行哈希处理,并在继续比较属性的实际值之前进行哈希比较(假设属性在任务期间不会更改值)。 - SimpleVar