如何正确使用不同并进行比较?

时间:2011-12-03 21:48:10

标签: c# linq

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

2 个答案:

答案 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()方法。