Есть ли метод LINQ, чтобы найти разницу между двумя родовыми словарями?
То же, что и в this question, но с родовыми словарями.найти разницу между двумя словарями
ответ
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne));
этот метод сравнивает только ключи? –
@ bto.rdz Нет, как ключ, так и значение. – Magnus
Отлично но не забудьте проверить на 'null' –
что-то вроде этого?
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));
Не включает эти элементы только в' dictTwo', но не в 'dictOne'. –
Если производительность важна, вы можете использовать хэш-поиск словарного класса и получить увеличение скорости. Я взял тестовый сценарий словаря с 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;
}
}
}
- 1. Найти разницу между двумя вложенными словарями
- 2. Python: Найти разницу между двумя словарями, содержащих списки
- 3. скрипт, чтобы найти разницу между двумя словарями в python
- 4. Как получить разницу между двумя словарями в Python?
- 5. Как найти отображение между двумя хешами/словарями
- 6. Найти разницу между двумя сигналами
- 7. Найти разницу между двумя температурами
- 8. Найти разницу между двумя файлами
- 9. Найти разницу между двумя массивами
- 10. Найти разницу между двумя объектами
- 11. Краткий способ найти «ключевую» разницу между 2 словарями?
- 12. поиск пропавших записей между двумя словарями
- 13. Разница между двумя словарями, использующими linq
- 14. найти разницу между двумя файлами XML
- 15. Найти разницу между двумя древовидными структурами C#
- 16. Найти симметричную разницу между двумя массивами
- 17. Найти разницу между двумя целыми интервалами
- 18. Найти разницу между двумя объектами в C#
- 19. Как найти разницу между двумя документами XML
- 20. Найти разницу между двумя датами в PHP
- 21. Найти минимальную разницу между двумя массивами
- 22. Найти разницу между двумя числами в часах
- 23. Найти разницу между двумя датами/раз
- 24. Как найти разницу между двумя временными интервалами
- 25. , пытаясь найти максимальную разницу между двумя массивами
- 26. SQL, чтобы найти разницу между двумя строками
- 27. Найти разницу между двумя датами в месяцах
- 28. Найти разницу между двумя многомерными списками
- 29. Как найти разницу между двумя датами?
- 30. Найти разницу между двумя массивами int
Вы можете использовать 'AsEnumerable' чтобы«конвертировать»свой словарь в' IEnumerable ', а затем использовать решение, предложенное в связанном вопросе. Поскольку KeyValuePair является структурой, он должен сравнивать по значению. –
Heinzi
Вам не нужно 'AsEnumerable', так как это абсолютно не конвертируется. Это только удобный метод для ограничения методов intellisense для 'IEnumerable' расширений, а также позволяет использовать расширения 'IEnumerable ' на объектах, которые также реализуют 'IQueryable ' без необходимости кастования. –
Nuffin
'dic1.Except (x => dic2.Contains (x)). Union (dic2.Except (x => dic1.Contais (X));', вам нужен лучший метод? –