Есть ли метод LINQ, чтобы найти разницу между двумя родовыми словарями?
То же, что и в этом вопросе, но с родовыми словарями.
Найти разницу между двумя словарями
Ответ 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));