簡體   English   中英

如何檢查兩個詞典是否包含相同的值?

[英]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方法,可以比較您想要比較的內容。 如果鍵或值沒有這些方法的適當實現,那么這將不起作用。

您的方法也不提供要傳遞的自定義IComparerIEqualityComparer對象的功能,以便考慮對象沒有其中一種方法的理想實現的情況。 在您的特定情況下,這是否是一個問題,我們不能說。

您的解決方案還需要對所有值進行排序,這比設置等於的其他可能實現的效率稍差,但它並沒有顯着惡化,因此如果您沒有特別大的集合,那么這不應該是一個巨大的問題。

一種具有與您的功能相當但速度提高的方法(保留前兩個檢查):

return !source.Except(toCheck).Any();

由於此方法不依賴於排序,因此它還提供了不需要TKey來實現IComparable的好處。

這個方法和你的方法都工作的一個關鍵原因是KeyValuePair它的EqualsGetHashCode的定義重寫為基於它自己的引用,而不是它所包含的鍵和值。 如果鍵和值都相等,則兩個KeyValuePairs相等,並且哈希碼包含鍵和值的哈希碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM