Skip to content

Посты

Компаратор коллекций, поиск различий между двумя коллекциями

22 июля 2019 г. • 2 мин чтения

Компаратор коллекций, поиск различий между двумя коллекциями

Приходилось ли вам сравнивать две коллекции и выполнять логику на основе того, находится ли элемент в исходной коллекции, в сравниваемой коллекции или в обеих? Мне тоже, мне нужно было объединить данные из пользовательского интерфейса и базы данных. Я не нашел хорошего решения, поэтому написал компаратор коллекций.

Чтобы проиллюстрировать, как это работает, давайте рассмотрим пример.

В исходных данных у нас есть значения 1, 3, 4, 6, а в
сравниваемой коллекции у нас есть значения 1, 2, 3, 4, 5.

В исходных данных отсутствуют 2 и 5 при сравнении со сравниваемой коллекцией, а в сравниваемой коллекции отсутствует 6 при сравнении с исходной коллекцией.

Давайте пройдемся через это объединение:

  1. в обеих (обновить)
  2. только в сравниваемой коллекции (добавить в исходную)
  3. в обеих (обновить)
  4. в обеих (обновить)
  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.

↑ Вернуться в начало

Вам также может понравиться