Подтвердить что ты не робот

Найти разницу между двумя словарями

Есть ли метод LINQ, чтобы найти разницу между двумя родовыми словарями?
То же, что и в этом вопросе, но с родовыми словарями.

4b9b3361

Ответ 1

var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne));

Ответ 2

Если производительность важна, вы можете захотеть использовать хэш-поиск класса Dictionary и получить повышение скорости. Я взял тестовый сценарий словаря с 1 миллионом записей, глубоко скопировал его и сделал 10 исправлений (5 записей удалены, 5 добавлено) в копию. [У меня была задача сделать это, включая поиск изменений в данных, а затем нажатие только изменений на другую функцию.]

С LINQ (см. ответ Магнуса) время, прошедшее в соответствии с секундомером, составляло 3600 мсек. При простом сравнении с использованием Dictionary.Contains() время, прошедшее, составляло 600 мс. Окружающая среда была сообществом Visual Studio 2017 в режиме отладки для тестового жгута ConsoleApp на той же машине.

Ваш пробег может отличаться, и у вас может быть небольшое количество строк, поэтому это может и не иметь значения, но для больших словарей платит использование функциональности поиска класса Dictionary.

    public static void DiffDictionaries<T, U>(
        Dictionary<T, U> dicA,
        Dictionary<T, U> dicB,
        Dictionary<T, U> dicAdd,
        Dictionary<T, U> dicDel)
    {
        // dicDel has entries that are in A, but not in B, 
        // ie they were deleted when moving from A to B
        diffDicSub<T, U>(dicA, dicB, dicDel);

        // dicAdd has entries that are in B, but not in A,
        // ie they were added when moving from A to B
        diffDicSub<T, U>(dicB, dicA, dicAdd);
    }

    private static void diffDicSub<T, U>(
        Dictionary<T, U> dicA,
        Dictionary<T, U> dicB,
        Dictionary<T, U> dicAExceptB)
    {
        // Walk A, and if any of the entries are not
        // in B, add them to the result dictionary.

        foreach (KeyValuePair<T, U> kvp in dicA)
        {
            if (!dicB.Contains(kvp))
            {
                dicAExceptB[kvp.Key] = kvp.Value;
            }
        }
    }

Ответ 3

что-то вроде этого?

var dicOne = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","faew"}};
var dicTwo = new Dictionary<string, string>(){ {"asdf", "asdf"}};

var unContained = dicOne.Where(x => !dicTwo.Contains(x));