Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确使用distinct和COMPARY?_C#_Linq - Fatal编程技术网

C# 如何正确使用distinct和COMPARY?

C# 如何正确使用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

我用的是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>
类帖子: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);