假设我有一个名为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();
答案 0 :(得分:6)
问题可能是MyClass
未实施IEquatable<MyClass>
以及覆盖Equals
和GetHashCode
。
为了让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方法。