我正在使用distinct
使用默认值从序列中返回不同的元素 等于比较来比较值。
然而,当我运行此代码时,我得到多个相同的id
var ls = ls2.Distinct().OrderByDescending(s => s.id);
foreach (var v in ls)
{
Console.WriteLine(v.id);
}
我在课堂上实现了这些,但这仍然无效
class Post : IComparable<Post>, IEqualityComparer<Post>, IComparer<Post>
这就是我实施它的方式
int IComparable<Post>.CompareTo(Post other)
{
return (int)(id - other.id);
}
bool IEqualityComparer<Post>.Equals(Post x, Post y)
{
return x.id == y.id;
}
int IEqualityComparer<Post>.GetHashCode(Post obj)
{
throw new NotImplementedException();
}
int IComparer<Post>.Compare(Post x, Post y)
{
return (int)(x.id - y.id);
}
答案 0 :(得分:3)
您应该实施GetHashCode()
。
由于您委托给-
和==
,为什么不委托id
中的相应功能。即。 id.Compare(other.id)
和obj.id.GetHashCode()
,并将Comparer委托给Compare。并实施IEquatable
int IComparable<Post>.CompareTo(Post other)
{
return id.Compare(other.id);
}
bool IEquatable<Post>.Equals(Post x)
{
return id == y.id;
}
bool IEqualityComparer<Post>.Equals(Post x, Post y)
{
return x.Equals(y.id);
}
int IEqualityComparer<Post>.GetHashCode(Post obj)
{
return obj.id.GetHashCode();
}
int IComparer<Post>.Compare(Post x, Post y)
{
return x.Compare(y);
}
这假设id是一个int,如果没有,那么你也可以为IE的IEquatable实现这些。
答案 1 :(得分:2)
您需要在比较器中正确实现GetHashCode()
- 在您的情况下,您只需返回ID的哈希码:
int IEqualityComparer<Post>.GetHashCode(Post obj)
{
return obj.id.GetHashCode();
}
正如@dash在评论中指出的那样,如果你选择去那条路线(选项1),你需要在IEquatable<T>
中实施Post
。
比较器应该在一个单独的类中实现,然后您可以在其中一个Distinct()
重载(选项2)中传入,即在您的情况下可以是类MyPostComparer
:
var ls = ls2.Distinct(new MyPostComparer()).OrderByDescending(s => s.id);
第三种选择是使用MoreLinq项目的DistinctBy()
方法。