簡體   English   中英

比較兩個詞典(詞典 <string, List<string> &gt;)

[英]Compare two dictionaries (Dictionary<string, List<string>>)

我需要檢查兩個類型為Dictionary<string, List<string>>是否相同。 到目前為止我有這個:

// dictionaries are already defined, so no parameters are required
private bool DictionariesEqual()
{
   return dictionary1.SequenceEqual(dictionary2);
}

我假設這只檢查鍵和值的順序是否相同,這不是我想要的,因為順序無關緊要,只有每個鍵和值的名稱

有沒有辦法檢查不相等的字符串的字典,如果找到第一個不匹配,則返回false?

編輯

感謝您的所有幫助,但仍無法識別價值變化。

更具體地說,這是函數(感謝@juharr)以及我如何使用它:

private bool DictionaryContentChanged()
{
    if(synonymDictionary.Count != temporaryDictionary.Count ||
       synonymDictionary.Keys.Except(temporaryDictionary.Keys).Any() ||
       !synonymDictionary.Join(
            temporaryDictionary,
            kvp => kvp.Key,
            kvp => kvp.Key,
            (kvp1, kvp2) => new
            {
                l1 = kvp1.Value,
                l2 = kvp2.Value
            })
            .All(a => a.l1.Count == a.l2.Count && !a.l1.Except(a.l2).Any()))
            return true;
        return false;
{

我把它放入一個Update函數,它以一定的間隔重復檢查變化:

void Update(int interval)
{
    while(!this.IsDisposed)
    {
        Set.Timer(interval);

        if(DictionaryContentChanged())
        {
            MessageBox.Show("Changes detected");
        }
        else
        {
            // move on
        }
    }
}

當我添加,刪除或更改值時沒有任何反應。 只有在更改密鑰或更改key.Count時,才會顯示消息框。 這可能與比較字典的功能有關嗎?

請記住,每個KeyValuePair的值代表一個通用List。

沒有測試,但我猜以下可能有效:

if (dictionary1.Count != dictionary2.Count) return false;
foreach (var kv in dictionary1) {
    if (!dictionary2.ContainsKey(kv.Key) return false;

    List list = dictionary2[kv.Key];
    if (!list.Count != dictionary1[kv.Key].Count) return false;

    foreach(var value in kv.Value) {
        if(!list.Contains(value)) return false;
    }
}
return true;

編輯:我添加了一些長度檢查。

這是一個Linq版本

dic1.Count == dic2.Count &&
!dic1.Keys.Except(dic2.Keys).Any() &&
dic1.Join(
    dic2,
    kvp => kvp.Key,
    kvp => kvp.Key,
    (kvp1, kvp2) => new
    {
        l1 = kvp1.Value,
        l2 = kvp2.Value
    })
    .All(a => a.l1.Count == a.l2.Count && !a.l1.Except(a.l2).Any())

首先,它確保字典具有相同數量的項目,然后確保它們具有相同的鍵。 然后它將它們連接到它們的鍵上,並確保具有相同鍵的所有列表具有相同的計數和相同的內容。

編輯

以下是獲得相反返回值的一些方法。

用()包裹整個東西並放一個! 在前。

!(dic1.Count == dic2.Count &&
!dic1.Keys.Except(dic2.Keys).Any() &&
dic1.Join(
    dic2,
    kvp => kvp.Key,
    kvp => kvp.Key,
    (kvp1, kvp2) => new
    {
        l1 = kvp1.Value,
        l2 = kvp2.Value
    })
    .All(a => a.l1.Count == a.l2.Count && !a.l1.Except(a.l2).Any()))

如果你分發not然后得到這個,請注意你必須將ands( && )更改為ors( || )。

dic1.Count != dic2.Count ||
dic1.Keys.Except(dic2.Keys).Any() ||
!dic1.Join(
    dic2,
    kvp => kvp.Key,
    kvp => kvp.Key,
    (kvp1, kvp2) => new
    {
        l1 = kvp1.Value,
        l2 = kvp2.Value
    })
    .All(a => a.l1.Count == a.l2.Count && !a.l1.Except(a.l2).Any())

這是基於德摩根定律所述

Not(A And B) = Not A Or Not B

另一種選擇是將您的方法從DictionaryContentChanged更改為DictionaryContentSame ,如果需要,只需在您使用它的地方取消它。

對兩個詞典進行排序並進行比較

bool result2 = dictionary1.OrderBy(r=>r.Key).SequenceEqual(dictionary2.OrderBy(r=>r.Key));

暫無
暫無

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

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