Репликация изменений в списке

Представьте, что у меня есть список элементов:

- A
 - B
 - C

Теперь откуда-то сервер сообщает моему приложению, что элемент B был удален, но он предоставляет только весь новый список, а не точные данные изменения. Поскольку WinRT ListView автоматически обновляет добавление, удаление и перемещение элементов внутри них, я бы предпочел не обновлять список поддержки и вызывать Reset - INotifyCollectionChanged -event, так как это оживляет каждый элемент, выглядящий довольно тупым и грубым, Вместо этого я хочу вычислить шаги, необходимые для преобразования моего локального списка в список, который я получаю с сервера. (Вид как расстояние levenshtein, просто не со счетом шагов, а с самими шагами)

е. г:.

1. Delete element B
 2. Add new element D to position 3

Как мне это сделать?

РЕДАКТИРОВАТЬ: имеет значение в моем случае.

2 ответа

Основываясь на названии страницы @MihaiCaracostea, я смог найти рабочий алгоритм работы, который работает на любом IList. Он даже использует yield для вычисления разницы, когда вы перечисляете изменения.

В статье можно найти здесь, фактический исходный код (если вы не хотите читать, как это делается) - это здесь.

Остерегайтесь, однако, алгоритм работает в O (n²) времени. В этой области, безусловно, есть место для улучшения.


Ищите элементы в исходном списке, которых нет в полученном списке: удалите их.

Ищите элементы в полученном списке, которых нет в исходном списке: добавьте их.

EDIT: посмотрите этот ресурс кодекса, показывая алгоритм diff.

licensed under cc by-sa 3.0 with attribution.