c# - 如何正确使用 distinct 和 compare?

标签 c# linq

我正在使用 distinct 表示

Returns distinct elements from a sequence by using the default equality comparer to compare values.

但是当我运行这段代码时,我得到了多个相同的 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);
                }

最佳答案

您应该实现 GetHashCode()

既然您要委托(delegate)给 -== 为什么不委托(delegate)给 id 中的适当函数。 IE。 id.Compare(other.id),和obj.id.GetHashCode(),委托(delegate)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,如果不是,那么您也可以为 IEquatable 实现这些 id。

关于c# - 如何正确使用 distinct 和 compare?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8371303/

相关文章:

c# - 如何从 MSI 安装程序中删除数字签名?

c# - 使用 .NET 4 让程序最小化到系统托盘的最简单方法

c# - 字典对象错误 : The name 'LotMaterialList' does not exist in the current context

c# - 如何将 SQL 中的多个内部联接转换为 LINQ?

c# - 我如何优化这个 linq 查询

C# 单元测试 - 生成模拟 DataContexts/LINQ -> SQL 类

C# MySQL 语法错误

c# - 是否可以在一行代码中使用一个 LINQ

linq - Ravendb/F#/Linq

c# - 数组初始化方式