【问题标题】:GetHashCode for a class with a list object [duplicate]具有列表对象的类的 GetHashCode [重复]
【发布时间】:2010-12-10 10:52:21
【问题描述】:

我有这样的课:

public class Cycle
{
          public List<int> Edges
        {
            get;
            private set;
        }

        public override bool Equals(object obj)
        {
            Cycle cycle = (Cycle)obj;

            var list1 = cycle.Edges;
            var list2 = Edges;
            var same = list1.Except(list2).Count() == 0 &&
                       list2.Except(list1).Count() == 0;
            return same;

        }

        public override int GetHashCode()
        {
         //   return Edges.GetHashCode();
        }
} 

如您所见,如果两个Edge 列表相同,那么我认为Cycles 相同。

现在的问题是如何实现GetHashCode()

我尝试了Edges.GetHashCode(),但问题是两个List&lt;Cycle&gt;,具有相同的Cycle 对象但不同的顺序,将被视为不同,即使它们应该相同。

【问题讨论】:

  • Except 是一个集合操作,它只给你不同的项目。如果不同的项目很重要,那么使用HashSet&lt;T&gt; 可能是更好的选择。它有HashSet&lt;T&gt;.CreateSetComparer,可以免费完成所有这些工作。在任何情况下,如果您只想比较不同的项目是否相等,那么!AnyCount == 0 性能更高。喜欢!list1.Except(list2).Any() &amp;&amp; !list2.Except(list1).Any();

标签: c# gethashcode


【解决方案1】:

你可以这样做:

override int GetHashCode()
{
  return Edges.Distinct().Aggregate(0, (x,y) =>x.GetHashCode() ^ y.GetHashCode());
}

这很简单,但应该一致。

【讨论】:

  • +1 我看不出在哪种情况下它可能会因为两个相等的列表而失败,你能详细说明一下吗?
  • {1,2,3} 与 {3,3,2,2,1,1}
  • 这里真的需要OrderBy吗?我认为应该这样做:Edges.Distinct().Aggregate(0, (x, y) =&gt; x ^ y.GetHashCode())。或(int)Edges.Distinct().Aggregate((x, y) =&gt; x.GetHashCode() ^ y.GetHashCode()) - 相同,前者更简洁。
  • @nawfal:我不记得了 :(
  • OrderBy 不需要,因为 XOR (^) 运算符的交换性和关联性属性。聚合中的 x.GetHashCode 调用也是多余的。 @nawfal 评论有正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2013-01-28
  • 1970-01-01
相关资源
最近更新 更多