SortedDictionary <tkey,tvalue =“”>:检查内容是否等于另一个SortedDictionary?</tkey,>

时间:2010-08-16 10:43:25

标签: c#

只是想知道:如果我有两个SortedDictionary对象,找出它们的内容是否相同的最快方法是什么? 循环所有键并检查值听起来不是最好的解决方案。 只需检查GetHashCode()吗?

编辑:我试过了一下。看到这段代码:

SortedDictionary<string, string> o1 = new SortedDictionary<string, string>( );
SortedDictionary<string, string> o2 = new SortedDictionary<string, string>( );
o1["k1"] = "v1";
o1["k2"] = "v2";
o1["k3"] = "v3";

o2["k2"] = "v2";
o2["k1"] = "v1";
o2["k3"] = "v3";

Console.WriteLine( "o1:" );
foreach ( KeyValuePair<string, string> oKeyValuePair in o1 )
{
    Console.WriteLine( oKeyValuePair.GetHashCode( ) );
}
Console.WriteLine( "o2:" );
foreach ( KeyValuePair<string, string> oKeyValuePair in o2 )
{
    Console.WriteLine( oKeyValuePair.GetHashCode( ) );
}
Console.ReadKey( );

对于两个已排序的词典,各个键值对的哈希码是相同的,即使添加值的顺序不同。这很好。 所以我错过了一步:如何从所有哈希码中获得一个唯一的哈希码?

2 个答案:

答案 0 :(得分:3)

不,即使GetHashCode覆盖它,检查SortedDictionary<,>也是不够的 - 我不相信它。

据我所知,你必须循环检查所有键和值。从根本上说,这就是任何解决方案必须要做的事情。您还应该检查所涉及的比较函数是否也是相同的......否则字典实际上并不相同。

答案 1 :(得分:2)

你必须准备好全部循环,但你可以先测试一些重要的捷径。

首先是快捷方式,是检查对象身份。虽然“A is A”并不像Ayn Rand想象的那么深刻,但它是一种使等式代码更快的方便方法。身份总是需要平等,并且在实际代码中最常将事物与自身进行比较(特别是在集合查找,循环以及对象通过多层代码传递的位置)。

另一个是,如果内容相同,大小不能不同,并且大小很快就可以获得。

因此,你能得到的最快的是:

public static bool EqualSortedDict<K, V>(SortedDictionary<K, V> x, SortedDictionary<K, V> y)
{
  if(ReferenceEquals(x, y))
    return true;
  if(ReferenceEquals(x, null) || ReferenceEquals(y, null))
    return false; //both being null already hit above.
  if(x.Count != y.Count)
    return false;
  if(!x.Comparer.Equals(y.Comparer))
    return false;//check if this is what you need. Probably is but might
                 //not be in some cases.
  foreach(KeyValuePair<K, V> kvp in x)
  {
    V cmpValue = default(V);
    if(!y.TryGetValue(kvp.Key, out cmpValue) || !kvp.Value.Equals(cmpValue))
      return false;
  }
  return true;
}

请注意,GetHashCode()上面没有工作的原因是SortedDictionary上的GetHashCode()的默认实现只适用于对象标识。如果您需要基于值的GetHashCode()(如果您的SortedDictionary本身是一个键或放在HashSet中),那么您将必须实现一个产生适当哈希码的IEqualityComparer。即使这样,它可能需要很长时间来计算自己(它可能总是循环遍历所有项目以做你想要的),而a.GetHashCode()!= b.GetHashCode()证明a!= b(对于由哈希码支持的相等定义),a.GetHashCode()== b.GetHashCode()不能证明a == b,因为会有冲突。