我了解如何在 IEnumerable 上执行 Distinct() 并且我必须为更高级的东西创建 IEqualityComparer 但是有没有办法可以告诉您返回哪个重复的项目?
例如说你有一个List<T>
List<MyClass> test = new List<MyClass>();
test.Add(new MyClass {ID = 1, InnerID = 4});
test.Add(new MyClass {ID = 2, InnerID = 4});
test.Add(new MyClass {ID = 3, InnerID = 14});
test.Add(new MyClass {ID = 4, InnerID = 14});
然后你做:
var distinctItems = test.Distinct(new DistinctItemComparer());
class DistinctItemComparer : IEqualityComparer<MyClass> {
public bool Equals(MyClass x, MyClass y) {
return x.InnerID == y.InnerID;;
}
public int GetHashCode(MyClassobj) {
return obj.InnerID.GetHasCode();
}
}
此代码将返回 ID 为 1 和 3 的类。有没有办法返回 ID 匹配 2 和 4。
我不相信这实际上是保证,但我会很惊讶地看到Distinct
更改按项目在源序列中出现的顺序返回项目。
因此,如果您想要特定的项目,您应该以这种方式订购源序列。例如:
items.OrderByDescending(x => x.Id)
.Distinct(new DistinctItemComparer());
请注意,将 Distinct 与自定义比较器一起使用的一种替代方法是使用DistinctBy
from MoreLINQ http://morelinq.googlecode.com:
items.OrderByDescending(x => x.Id)
.DistinctBy(x => x.InnerId);
尽管您不能保证正常的 LINQ to Objects 排序从Distinct
不会改变,我很乐意为 MoreLINQ 添加保证:)(老实说,这是唯一明智的排序。)
另一种选择是使用GroupBy
相反 - 然后对于每个内部 ID 你可以获得all匹配的项目,然后从那里开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)