C# 如何正确使用distinct和COMPARY?
我用的是distinct,它说 使用默认值从序列返回不同的元素 用于比较值的相等比较器 然而,当我运行这段代码时,我得到了多个相同的idC# 如何正确使用distinct和COMPARY?,c#,linq,C#,Linq,我用的是distinct,它说 使用默认值从序列返回不同的元素 用于比较值的相等比较器 然而,当我运行这段代码时,我得到了多个相同的id var ls = ls2.Distinct().OrderByDescending(s => s.id); foreach (var v in ls) { Console.WriteLine(v.id); } 我在课堂上实现了这些,但仍然不起作用 class Pos
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>
类帖子:IComparable、iQualityComparer、IComparer
我就是这样实现的
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);
}
int i可比较。比较到(其他后)
{
返回(int)(id-其他.id);
}
布尔IEqualityComparer.Equals(x后、y后)
{
返回x.id==y.id;
}
int IEqualityComparer.GetHashCode(Post obj)
{
抛出新的NotImplementedException();
}
int IComparer.Compare(x后、y后)
{
返回(int)(x.id-y.id);
}
您应该实现GetHashCode()
既然您要委托给-
和==
,为什么不直接委托给id
中的相应函数呢。例如,id.Compare(other.id)
和obj.id.GetHashCode()
,并委托比较器进行比较。并实现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);
}
int i可比较。比较到(其他后)
{
返回id.Compare(其他id);
}
布尔等式等于(x后)
{
返回id==y.id;
}
布尔IEqualityComparer.Equals(x后、y后)
{
返回x等于(y.id);
}
int IEqualityComparer.GetHashCode(Post obj)
{
返回obj.id.GetHashCode();
}
int IComparer.Compare(x后、y后)
{
返回x.Compare(y);
}
这假设id是一个int,如果不是,那么您可能已经为id实现了IEquatable。您需要在比较器中正确实现
GetHashCode()
-在您的情况下,您可以只返回id的哈希代码:
int IEqualityComparer<Post>.GetHashCode(Post obj)
{
return obj.id.GetHashCode();
}
第三种选择是使用MoreLinq项目的方法。根据MSDN文档,您只需要实现IEquatable-请参阅完整的示例。ide/dll中的注释不正确,这让我非常恼火。这是我第一次实现GetHashCode。Thanks@Preet,您可能需要将IEqualityComparer.Equals改为使用“return x.Equals(y);”。无法编辑它,因为更改仅为3个字符。
var ls = ls2.Distinct(new MyPostComparer()).OrderByDescending(s => s.id);