我對 c# 有點陌生,想在比較兩個字典時識別不具有相同值的鍵。
我擁有的字典是dict => KeyValuePair<string, string>。我有兩本字典,比如 -
dict1 => {"a":"False","b":"amazonaws.com","c":"True"}
dict2 => {"a":"True","b":"amazonaws.com","c":"False"}
我想比較兩個字典并回傳一個變數,該變數將具有 Keys ["a", "c"] 作為上面的示例,這些鍵具有不同的值。
目前,我撰寫的邏輯只會區分其他字典中沒有的鍵。
Dictionary dictExcept = null;
foreach (IDictionary kvp in dict1.Cast<object>().Where(kvp => !dict2.Contains(kvp)))
{
dictExcept.Add(kvp.Keys, kvp.Values);
}
return dictExcept ;
uj5u.com熱心網友回復:
您可以嘗試使用TryGetValue:
using System.Linq;
...
var dictExcept = dict1
.Where(pair => dict2.TryGetValue(pair.Key, out var value) &&
pair.Value != value)
.ToDictionary(pair => pair.Key,
pair => (first: pair.Value, second: dict2[pair.Key]));
在這里,我們對于每個鍵值pairfromdict1嘗試獲取對應的valuefrom dict2:
// dict2 has pair.Key it corresponds to value...
dict2.TryGetValue(pair.Key, out var value) &&
// however value from dict2 != value from dict1
pair.Value != value
如果您更喜歡使用相同的想法foreach(沒有Linq解決方案):
var dictExcept = new Dictionary<string, (string first, string second)>();
foreach (var pair in dict1)
if (dict2.TryGetValue(pair.Key, out var value) && value != pair.Value)
dictExcept.Add(pair.Key, (pair.Value, value));
演示:(小提琴)
var dict1 = new Dictionary<string, string> {
{ "a", "False" }, { "b", "False" }, { "c", "True" }, { "d", "dict1 only" } };
var dict2 = new Dictionary<string, string> {
{ "a", "False" }, { "b", "True" }, { "c", "False" }, { "e", "dict2 only" } };
var dictExcept = dict1
.Where(pair => dict2.TryGetValue(pair.Key, out var value) &&
pair.Value != value)
.ToDictionary(pair => pair.Key,
pair => (first: pair.Value, second: dict2[pair.Key]));
string report = string.Join(Environment.NewLine, dictExcept
.Select(pair => $"Key: {pair.Key}; Values: {pair.Value}"));
Console.Write(report);
結果:
Key: b; Values: (False, True)
Key: c; Values: (True, False)
uj5u.com熱心網友回復:
根據您的評論提供最簡單的答案:
兩個字典將具有相同的鍵,只是我們需要識別具有不同值的鍵
在不需要考慮缺失鍵的假設下作業,您可以簡單地迭代其中一個字典的所有鍵,并比較在該鍵下找到的值。
var keysWithDifferentValues = new List<string>();
foreach (var kvp in dict1)
{
if(!kvp.Value.Equals(dict2[kvp.Key]))
keysWithDifferentValues.Add(kvp.Key);
}
這可以使用 LINQ 簡化:
var keysWithDifferentValues =
dict1
.Where(kvp => !kvp.Value.Equals(dict2[kvp.Key]))
.Select(kvp => kvp.Key)
.ToList();
uj5u.com熱心網友回復:
既然你有一本名為 的字典dictExcept,那么用它Expect來為你做這項作業怎么樣?
產生兩個序列的集差。
來源
在你的情況下:
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
static void Main(string[] args)
{
var a = new Dictionary<string, string>{{"a", "False"}, {"b", "False"}, {"c", "True"}};
var b = new Dictionary<string, string>{{"a", "False"}, {"b", "True"}, {"c", "False"}};
var c = a.Except(b).Select(x => x.Key);
c.Dump();
}
}
輸出
[ b, c ]
在線試試吧!
更多不同情況的例子:
static void Main(string[] args)
{
var a = new Dictionary<string, string>{{"a", "False"}, {"b", "False"}, {"c", "True"}};
var b = new Dictionary<string, string>{{"a", "False"}, {"b", "True"}, {"c", "False"}};
var c = a.Except(b).Select(x => x.Key);
// c is [ b ,c ]
a.Add("d", "foo");
var d = a.Except(b).Select(x => x.Key);
// d is [ b, c, d ]
b.Add("e", "foo");
var e = a.Except(b).Select(x => x.Key);
// e is still [ b, c, d ]
var e2 = (a.Except(b)).Union(b.Except(a)).Select(x => x.Key).Distinct();
// e is [ b, c, d, e ]
}
在線試用!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387578.html
上一篇:字典理解Python
