Снимок коллекции для сравнения IsDirty - PullRequest
1 голос
/ 25 августа 2010

Каков хороший (быстрый, эффективный и т. Д.) Способ хранения снимка коллекции для последующей проверки IsDirty?

Приветствия,
Берриль

Ответы [ 3 ]

4 голосов
/ 25 августа 2010

Если вы просто хотите сохранить снимок и проверить, изменяется ли размер вашего списка (элемент добавлен / удален)

var snapshot = new List<Foo>(list);

Однако, если вы изменяете элементы в списке и хотите проверить, есть ли элементыизменилось, вам придется клонировать каждый элемент.Если вы просто поместите их в другой список, ссылки должны остаться прежними.

var snapshot = list.Select(item => new Foo 
                                  { 
                                      Property1 = item.Property1,
                                      ... , 
                                      PropertyN = item.PropertyN 
                                   });

Если вы просто хотите посмотреть, изменится ли счет в списке, вы можете использовать первую версию.

Возможно, у вас есть Идентификатор на ваших объектах, который упрощает решение до чего-то вроде

var snapshot = list.Select(item => item.Id);

Список идентификаторов можно использовать, чтобы увидеть, изменилось ли содержимое.Этот шаблон поможет, если у ваших объектов слишком много памяти.

Однако вы можете использовать ObservableCollection<T>, в котором есть события для уведомления вас об изменениях.Таким образом, вы можете отслеживать все изменения в коллекции (добавить / удалить / заменить).

3 голосов
/ 25 августа 2010

Зависит от того, что вы хотите.

  • Для создания снимка коллекции вы можете просто позвонить IEnumerable<T>.ToList.
  • Если вы также хотите создать моментальный снимок как списка, так и каждого объекта в списке, вам также необходимо сделать отдельную копию каждого объекта. Как лучше всего сделать копию, зависит от конкретного типа вашей коллекции. У некоторых типов есть метод Clone. С другими вы можете вызвать конструктор. Некоторые типы не могут быть легко скопированы.

Пример:

List<Foo> snapshot = foos.Select(x => new Foo(x)).ToList();

Чтобы проверить, равны ли два IEnumerable<T> (то есть проверить, что изменений нет), вы можете использовать SequenceEqual. Вам также нужно будет указать IEqualityComparer, если ваш класс не реализует Equals так, как вам нужно.

Если вы хотите иметь эффективный способ найти определенный элемент в снимке из его поля id, тогда вместо списка вы можете использовать Dictionary<K, V>. Звоните IEnumerable<T>.ToDictionary, чтобы создать словарь из вашей коллекции.

0 голосов
/ 25 августа 2010

Вы пытаетесь проверить коллекцию или каждого отдельного участника?

Один из подходов - использовать ObservableCollection<T>.Вы можете подписаться на события, которые возникают при каждом изменении коллекции.Аргументы события указывают на элемент и тип изменения.

...