Если важна производительность, вы можете использовать поиск по хэшу в классе 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;
}
}
}