收集价值比较

时间:2011-09-09 09:10:06

标签: c#

我有并想要比较两个IDictionary集合的特定键值。 例如。 IDictionary col1和E.g. IDictionary col2。

我正在循环集合中的所有项目,最后使用此“Equals”来比较两个集合中的键值 -

if(col1.Values[key2].Equals(col2.Values[key2])) 
{

}

但是“Equals”会比较对象引用,所以它是正确的方法或任何替代解决方案吗?

1 个答案:

答案 0 :(得分:1)

你可以做几件事:

  1. 在代表您的值的类型上覆盖Equals(和GetHashCode)
  2. 不要使用equals进行比较,而是使用自己的函数进行比较
  3. 实现比较器并使用它 还有几个
  4. 在这种情况下,我会使用2)如果你不需要在其他地方比较这些值,那么你可以使用1

    备注1:)

    您需要使用ValueType(MyValue):

    class MyValue
    {
       // ...
       public override GetHashCode()
       {
          return this.Property1.GetHashCode();
          // if you want to compare more properties hash them all and use some function (for example ^)
          // to "add" the values
       }
    
       public override Equals(obj o)
       {
          if (ReferenceEquals(null, o)) return false;
          if (ReferenceEquals(this, o)) return true;
          if (o.GetType() != typeof (MyValue)) return false;
          var v2 = o as MyValue;
          return Equals(v2.Property1, this.Property1);
          // if you want to compare more than one property use && and Equals on them all
       }
    }
    

    备注2 :) 而不是

    if(col1.Values[key2].Equals(col2.Values[key2])) 
    

    使用像这样的东西

    bool CompareTwoValues(MyValue v1, MyValue v2)
    {
       if(!Equals(v1.Property1, v2.Property1)) return false;
       // ... whatever you have to compare based on the values
       return true;
    }
    

    if (CompareTwoValues(col1.Values[key2], col2.Values[key2])
    {
      // ....
    }
    

    PS:Equals和GetHashCode有时候(非常)tricke - 请搜索一下以确保GetHashCode正确实现。另外,最好只通过这种方式比较类中的不可变值。