为什么这个LINQ查询不能按预期工作?

时间:2011-11-14 18:17:44

标签: c# linq

假设我有一个名为MyClass的类,它有两个属性(int Id和一个字符串Name)。我想从另一个集合中填充这些MyClass对象的List,但我只想要唯一的。这个其他集合是第三方对象,它有一个名为'Properties'的属性,它只是一个值数组,前两个对应于我关心的Id和Name值。这个系列可能有重复,所以我只想要独一无二的。

看起来这应该可以做到这一点,但事实并非如此,它会返回所有项目而不管欺骗。我在这里做错了什么?

List<MyClass> items = (from MyClass mc in collectionOfProps 
select new MyClass() { 
Id = collectionOfProps.Properties[0], 
Name = collectionOfProps.Properties[1] }).Distinct().ToList();

3 个答案:

答案 0 :(得分:6)

问题可能是MyClass未实施IEquatable<MyClass>以及覆盖EqualsGetHashCode

为了让Distinct()以您想要的方式运作,您必须实施IEquatable<T>。否则,它使用默认(引用相等)进行检查,这意味着只有当它们是完全相同的实例时才会确定元素不是唯一的。

答案 1 :(得分:1)

您需要覆盖Equals() GetHashCode() 以按值比较实例。

答案 2 :(得分:0)

你是否在MyClass中覆盖了相等(for distinct)?我的猜测是否定的。

根据文件:

http://msdn.microsoft.com/en-us/library/bb348436.aspx

  

默认的相等比较器Default用于比较实现IEquatable(Of T)泛型接口的类型的值。要比较自定义数据类型,您需要实现此接口并为该类型提供自己的GetHashCode和Equals方法。