В сочетании с пользовательским расширением SequenceEquals
вы можете указать, как вы будете сравнивать ключи и значения с чем-то вроде этого:
public static bool Equals<TKey, TValue>(IDictionary<TKey, TValue> a, IDictionary<TKey, TValue> b,
IComparer<TKey> keyComparer, IEqualityComparer<TValue> valueComparer)
{
if (ReferenceEquals(a, b))
return true;
if (b == null || a == null)
return false;
if (a.Count != b.Count)
return false;
var aOrdered = a.OrderBy(k => k.Key, keyComparer);
var bOrdered = b.OrderBy(k => k.Key, keyComparer);
return aOrdered.SequenceEqual(bOrdered, valueComparer);
}
Расширение:
public static bool SequenceEqual<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> first, IEnumerable<KeyValuePair<TKey, TValue>> second, IEqualityComparer<TValue> valueComparer)
{
if (valueComparer == null) valueComparer = EqualityComparer<TValue>.Default;
if (first == null) throw new ArgumentNullException(nameof(first));
if (second == null) throw new ArgumentNullException(nameof(second));
using (IEnumerator<KeyValuePair<TKey, TValue>> e1 = first.GetEnumerator())
using (IEnumerator<KeyValuePair<TKey, TValue>> e2 = second.GetEnumerator())
{
while (e1.MoveNext())
{
if (!(e2.MoveNext() && valueComparer.Equals(e1.Current.Value, e2.Current.Value))) return false;
}
if (e2.MoveNext()) return false;
}
return true;
}
Который вы могли бы назвать в конкретном примере Dictionary<string,int>
ОП:
var areEqual = Equals(d1, d2, StringComparer.OrdinalIgnoreCase, EqualityComparer<int>.Default);