如果您需要对两者进行全面比较(考虑Venn图表结果),则对于给定的键,假设它至少存在于字典中之一,则有四个离散的结果
public enum KeyCompareResult
{
ValueEqual,
NotInLeft,
NotInRight,
ValueNotEqual,
}
要获取字典中的所有键,请使用
dictionary.Keys
。要获取任一字典中的键集,请使用
Enumerable.Union
,它将合并集合并过滤重复项。
假设您想要一些更通用的方法,那么您可以编写以下比较:
public IEnumerable<KeyValuePair<TKey, KeyCompareResult>> GetDifferences<TKey, TValue>(
IDictionary<TKey, TValue> leftDict,
IDictionary<TKey, TValue> rightDict,
IEqualityComparer<TValue> comparer = null)
{
var keys = leftDict.Keys.Union(rightDict.Keys);
comparer ??= EqualityComparer<TValue>.Default;
return keys.Select(key =>
{
if (!leftDict.TryGetValue(key, out var left))
{
return KeyValuePair.Create<TKey, KeyCompareResult>(key, KeyCompareResult.NotInLeft);
}
else if (!rightDict.TryGetValue(key, out var right))
{
return KeyValuePair.Create<TKey, KeyCompareResult>(key, KeyCompareResult.NotInRight);
}
else if (!comparer.Equals(left, right))
{
return KeyValuePair.Create<TKey, KeyCompareResult>(key, KeyCompareResult.ValueNotEqual);
}
else
{
return KeyValuePair.Create<TKey, KeyCompareResult>(key, KeyCompareResult.ValueEqual);
}
});
}
左/右的区别不明显,除非您查看方法调用,因此,您可能希望将方法结果选择为消息或其他更有意义的数据结构
var left = new Dictionary<int, string> { { 1, "one" }, { 2, "two" }, { 4, "four" } };
var right = new Dictionary<int, string> { { 1, "one" }, { 2, "A different value" }, { 3, "three" } };
GetDifferences(left, right, StringComparer.InvariantCulture)
.Display();