[英]Validate and Compare between two dictionaries when both Dictionaries value contains List like "Dictionary<string, List<string>>"
[英]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.