[英]How to check if two dictionaries contain the same values?
我有這個,但它太短了我幾乎可以肯定我錯過了一些東西:
public static bool ValueEquals<TKey, TValue>
(this IDictionary<TKey, TValue> source, IDictionary<TKey, TValue> toCheck)
{
if (object.ReferenceEquals(source, toCheck))
return true;
if (source == null || toCheck == null || source.Count != toCheck.Count)
return false;
return source.OrderBy(t => t.Key).SequenceEqual(toCheck.OrderBy(t => t.Key));
}
所以基本上,如果他們有相同的參考,則返回true
。 如果其中任何一個為null
或其計數不同,則返回false
。 然后返回序列(按鍵和它們的值排序)是否相同。 我必須遺漏一些東西,因為它太短而不夠好。
是的,您的代碼將起作用,只要密鑰都實現IComparable
並且鍵和值都有一個Equals
方法,可以比較您想要比較的內容。 如果鍵或值沒有這些方法的適當實現,那么這將不起作用。
您的方法也不提供要傳遞的自定義IComparer
或IEqualityComparer
對象的功能,以便考慮對象沒有其中一種方法的理想實現的情況。 在您的特定情況下,這是否是一個問題,我們不能說。
您的解決方案還需要對所有值進行排序,這比設置等於的其他可能實現的效率稍差,但它並沒有顯着惡化,因此如果您沒有特別大的集合,那么這不應該是一個巨大的問題。
一種具有與您的功能相當但速度提高的方法(保留前兩個檢查):
return !source.Except(toCheck).Any();
由於此方法不依賴於排序,因此它還提供了不需要TKey
來實現IComparable
的好處。
這個方法和你的方法都工作的一個關鍵原因是KeyValuePair
它的Equals
和GetHashCode
的定義重寫為基於它自己的引用,而不是它所包含的鍵和值。 如果鍵和值都相等,則兩個KeyValuePairs
相等,並且哈希碼包含鍵和值的哈希碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.