我有并想要比较两个IDictionary集合的特定键值。 例如。 IDictionary col1和E.g. IDictionary col2。
我正在循环集合中的所有项目,最后使用此“Equals”来比较两个集合中的键值 -
if(col1.Values[key2].Equals(col2.Values[key2]))
{
}
但是“Equals”会比较对象引用,所以它是正确的方法或任何替代解决方案吗?
答案 0 :(得分:1)
你可以做几件事:
在这种情况下,我会使用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正确实现。另外,最好只通过这种方式比较类中的不可变值。