найти разницу между двумя словарями - PullRequest
14 голосов
/ 13 января 2012

Существует ли метод LINQ для поиска различий между двумя общими словарями?
То же, что и в этот вопрос , но с общими словарями.

Ответы [ 3 ]

25 голосов
/ 13 января 2012
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne));
2 голосов
/ 18 апреля 2017

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

С LINQ (см. Ответ Магнуса) истекшее время в соответствии с секундомером составило 3600 мс.При простом сравнении с использованием Dictionary.Contains () прошедшее время составляло 600 мс.Среда была Visual Studio 2017 Community в режиме отладки для тестового жгута 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;
            }
        }
    }
0 голосов
/ 13 января 2012

как то так?

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