Skip to content

Посты

Сравниватель коллекций: поиск различий между двумя коллекциями

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

Сравниватель коллекций: поиск различий между двумя коллекциями

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

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

В исходных данных у нас есть значения 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.

Автор: Чак Конвей специализируется на разработке программного обеспечения и генеративном ИИ. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube.

↑ Наверх

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