只是想知道:如果我有两个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( );
对于两个已排序的词典,各个键值对的哈希码是相同的,即使添加值的顺序不同。这很好。 所以我错过了一步:如何从所有哈希码中获得一个唯一的哈希码?
答案 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,因为会有冲突。