Посты
Сравниватель коллекций: поиск различий между двумя коллекциями
22 июля 2019 г. • 2 мин чтения

Приходилось ли вам сравнивать две коллекции и выполнять некоторую логику в зависимости от того, находится ли элемент в исходной коллекции, в сравниваемой коллекции или в обеих? Да, мне тоже, мне нужно было объединить данные из UI и базы данных. Я не смог найти хорошего решения, поэтому написал сравниватель коллекций.
Чтобы проиллюстрировать, как это работает, давайте рассмотрим пример.
В исходных данных у нас есть значения 1, 3, 4, 6, а в
сравниваемой коллекции у нас есть значения 1, 2, 3, 4, 5.
В исходных данных отсутствуют 2 и 5 по сравнению со сравниваемой коллекцией, а в сравниваемой коллекции отсутствует 6 по сравнению с исходной коллекцией.
Давайте пройдемся по этому слиянию:
- в обеих (обновить)
- только в сравниваемой коллекции (добавить к исходной)
- в обеих (обновить)
- в обеих (обновить)
- только в сравниваемой коллекции (добавить к исходной)
- только в исходной коллекции (удалить из исходной)
Вот как выглядит код:
var source = new []{1, 3, 4, 6};
var collection = new[] {1, 2, 3, 4, 5};
source.CompareTo(collection, (s, d) => s == d)
.OnlyInSourceCollection(s=> {/* do something */})
.OnlyInComparingCollection(s=>{/* do something */})
.InBoth(s=> {/*do something*/})
.Process();
Почему не использовать LINQ?
Вы можете использовать LINQ, однако LINQ будет итерировать коллекции как минимум 3 раза, что не включает операции (добавление, обновление и удаление) с данными. Используя CollectionComparer
, данные итерируются только дважды.
Существуют более быстрые способы найти различия, такие как бинарный поиск, но бинарный поиск работает только с целыми числами. Сравниватель коллекций поддерживает любой тип сравнения. Сравнение определяется этим кодом: (s, d) => s == d
.
Исходный код находится на GitHub.
Автор: Чак Конвей специализируется на разработке программного обеспечения и генеративном ИИ. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube.