Посты
Компаратор коллекций, поиск различий между двумя коллекциями
22 июля 2019 г. • 2 мин чтения
Приходилось ли вам сравнивать две коллекции и выполнять логику на основе того, находится ли элемент в исходной коллекции, в сравниваемой коллекции или в обеих? Мне тоже, мне нужно было объединить данные из пользовательского интерфейса и базы данных. Я не нашел хорошего решения, поэтому написал компаратор коллекций.
Чтобы проиллюстрировать, как это работает, давайте рассмотрим пример.
В исходных данных у нас есть значения 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.
Автор: Chuck Conway — инженер AI с почти 30-летним опытом разработки программного обеспечения. Он создает практические системы AI — конвейеры контента, агенты инфраструктуры и инструменты, которые решают реальные проблемы — и делится тем, что он узнает на этом пути. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube и на SubStack.