C # сравнить словари на равенство - PullRequest
0 голосов
/ 03 сентября 2018

Как наиболее эффективно сравнить два словаря на равенство? - кроме перебора ключей методом перебора, попробуйте поиск и сравнение значений

var d1 = new Dictionary<string,int>();
d1.Add("a",2);
d1.Add("b",1);
d1.Add("c",1);

var d2 = new Dictionary<string,int>();
d2.Add("c",1);
d2.Add("b",1);
d2.Add("a",2);

Как наиболее эффективно сравнить на равенство?

Не грубая сила, как это:

static bool CompareDictionaries(Dictionary<string,int> d1, Dictionary<string,int> d2)
{
    if (d1.Count != d2.Count) return false;
    foreach(string key in d1.Keys)
    {
        if (!d2.ContainsKey(key)) return false;
        if (d1[key] != d2[key]) return false;
    }
    return true;
}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Если ключи словаря совпадают, вы можете использовать HashSet для сравнения:

var set1 = new HashSet<int>(dictionary1.Values);
var set2 = new HashSet<int>(dictionary2.Values);

Затем можно использовать объединение, пересечение, за исключением того, что выставлено HashSet. Также вы можете использовать это:

bool isEqual = set1.SetEquals(set2);

В зависимости от вашей ситуации, бенчмаркинг (HashSet vs Dictionary) здесь

0 голосов
/ 03 сентября 2018

В сочетании с пользовательским расширением 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...