2015-09-09 2 views
7

Imagine У меня есть список пунктов:Репликация изменения в списке

 
- A 
- B 
- C 

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

e. g .:

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

Как бы я это сделал?

EDIT: заказ вопросы в моем случае.

+2

Вы можете посмотреть алгоритмы дифференциации - https://en.wikipedia.org/wiki/Diff_utility –

ответ

3

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

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

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

+1

Очень хороший пост, приятель! –

+0

@MihaiCaracostea Да, это момент, когда и вопрос, и ответ заслуживают продолжения :) –

+0

В настоящее время я помещаю весь этот код (включая некоторые дополнительные методы для преобразования одного списка в другой) в библиотеку NuGet. Я отправлю ссылку здесь, когда это будет сделано. –

2

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

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

РЕДАКТИРОВАТЬ: посмотреть на this codeproject resource, показывая алгоритм дифференциала.

+0

Это работает до тех пор, пока заказ не имеет значения. –

+0

Заказ имеет значение в моем случае. –

+0

@NeoLegends См. Ссылку в редакции. –

Смежные вопросы