【问题标题】:How do I properly use distinct and compare?如何正确使用 distinct 和 compare?
【发布时间】:2011-12-04 05:59:29
【问题描述】:

我正在使用 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);
                }

【问题讨论】:

标签: c# linq


【解决方案1】:

你应该实现GetHashCode()

既然您要委托给-==,为什么不直接委托给id 中的适当功能。 IE。 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,如果不是,那么你可能已经为 IEquatable 实现了这些。

【讨论】:

  • 我很生气 ide/dll 中的评论不正确。这是我第一次必须实现 GetHashCode。谢谢
  • @Preet,您可能希望修复 IEqualityComparer.Equals 以具有“return x.Equals(y);”反而。无法编辑,因为更改只有 3 个字符。
【解决方案2】:

您需要在比较器中正确实现GetHashCode() - 在您的情况下,您可以只返回 id 的哈希码:

int IEqualityComparer<Post>.GetHashCode(Post obj)
{
   return obj.id.GetHashCode();
}

正如@dash 在评论中指出的那样,如果您选择走那条路线(选项 1),您需要在 Post 中实现 IEquatable&lt;T&gt;

比较器应该在一个单独的类中实现,然后您可以传入 Distinct() 重载之一(选项 2),即在您的情况下可以是类 MyPostComparer

var ls = ls2.Distinct(new MyPostComparer()).OrderByDescending(s => s.id);

第三种选择是使用 MoreLinq 项目的 DistinctBy() 方法。

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2018-04-23
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多