Jef*_*ata 37 c# linq comparison dictionary
我想比较两个Dictionary<string, string>实例的内容,无论它们包含的项目的顺序如何. SequenceEquals还比较了顺序,所以我首先按键排序字典,然后调用SequenceEquals.
有没有我可以使用的方法而不是SequenceEquals只比较内容?
如果没有,这是理想的方法吗?
Dictionary<string, string> source = new Dictionary<string, string>();
Dictionary<string, string> target = new Dictionary<string, string>();
source["foo"] = "bar";
source["baz"] = "zed";
source["blah"] = null;
target["baz"] = "zed";
target["blah"] = null;
target["foo"] = "bar";
// sequenceEquals will be false
var sequenceEqual = source.SequenceEqual(target);
// contentsEqual will be true
var contentsEqual = source.OrderBy(x => x.Key).SequenceEqual(target.OrderBy(x => x.Key));
Run Code Online (Sandbox Code Playgroud)
Luk*_*keH 53
var contentsEqual = source.DictionaryEqual(target);
// ...
public static bool DictionaryEqual<TKey, TValue>(
this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second)
{
return first.DictionaryEqual(second, null);
}
public static bool DictionaryEqual<TKey, TValue>(
this IDictionary<TKey, TValue> first, IDictionary<TKey, TValue> second,
IEqualityComparer<TValue> valueComparer)
{
if (first == second) return true;
if ((first == null) || (second == null)) return false;
if (first.Count != second.Count) return false;
valueComparer = valueComparer ?? EqualityComparer<TValue>.Default;
foreach (var kvp in first)
{
TValue secondValue;
if (!second.TryGetValue(kvp.Key, out secondValue)) return false;
if (!valueComparer.Equals(kvp.Value, secondValue)) return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我不知道是否有一个现有的方法但你可以使用以下(为了简洁省略了args的空检查)
public static bool DictionaryEquals<TKey,TValue>(
this Dictionary<TKey,TValue> left,
Dictionary<TKey,TValue> right ) {
var comp = EqualityComparer<TValue>.Default;
if ( left.Count != right.Count ) {
return false;
}
foreach ( var pair in left ) {
TValue value;
if ( !right.TryGetValue(pair.Key, out value)
|| !comp.Equals(pair.Value, value) ) {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
最好添加一个重载以允许自定义EqualityComparer<TValue>.
| 归档时间: |
|
| 查看次数: |
35579 次 |
| 最近记录: |