【问题标题】:collection value comparsion收藏价值比较
【发布时间】:2011-09-09 09:10:06
【问题描述】:

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

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

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

}

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

【问题讨论】:

  • 如果Equals 比较引用取决于它是否在类中被覆盖。那么你的字典中的值是什么类型的呢?
  • 本帖标题与提问无关
  • 键是字符串,值是对象。
  • 如果值是并且对象做 Col1 和 Col2 总是包含相同的底层类型,例如你确定你从不将字符串与 int 进行比较吗?
  • 因为值是对象,对于两个集合中的相同键,值将是相同的类型(字符串或整数或任何东西)。

标签: c#


【解决方案1】:

你可以做几件事:

  1. 在代表您的值的类型上覆盖 Equals(和 GetHashCode)
  2. 不要使用 equals 而是使用您自己的函数进行比较
  3. 实现一个比较器并使用它 还有更多

在这种情况下,如果您不需要在其他地方比较这些值,我会使用 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 有时可能(非常)诡计 - 请稍作搜索以确保 GetHashCode 已正确实现。最好只用这种方式比较你的类上的不可变值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多