2015-09-09 9 views
7

Imagine Mam listę elementów:Replikowanie zmian w wykazie

 
- A 
- B 
- C 

Teraz gdzieś serwer mówi mój wniosek, że pierwiastek B została usunięta, a mimo to zapewnia tylko całą nową listę, a nie dokładną zmianę Detale. Ponieważ WinRT ListView s automatycznie animuje dodawanie, usuwanie i przenoszenie elementów wewnątrz nich, wolałbym nie odświeżać listy kopii zapasowych i wywoływać Reset-INotifyCollectionChanged -event, ponieważ animuje każdy element, który wygląda raczej tępo i szorstko. Zamiast tego, chcę obliczyć kroki, które są potrzebne do przekształcenia mojej lokalnej listy na listę, którą otrzymuję z serwera. (Trochę jak dystans dzielący, ale nie licząc kroków, ale samych kroków)

e. g .:

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

Jak to zrobić?

EDYCJA: Zamów sprawach w moim przypadku.

+2

Można przyjrzeć się algorytmom różnicowym - https://en.wikipedia.org/wiki/Diff_utility –

Odpowiedz

3

Na podstawie tytułu strony @MihaiCaracostea zasugerował, że udało mi się znaleźć działający algorytm diff, który działa na każdym IList<T>. Używa nawet yield, aby obliczyć różnicę leniwie podczas wyliczania zmian.

Artykuł można znaleźć here, rzeczywisty kod źródłowy (jeśli nie chcesz czytać, jak to się robi) to here.

Pamiętaj jednak, że algorytm działa w czasie O (n²). Z pewnością istnieje pole do poprawy w tym obszarze.

+1

Bardzo dobry post, kolego! –

+0

@MihaiCaracostea Tak, to moment, w którym zarówno pytanie, jak i odpowiedź zasługują na awans :) –

+0

Obecnie umieszczam cały ten kod (łącznie z dodatkowymi metodami przekształcania jednej listy w inną) w bibliotekę NuGet. Opublikuję link tutaj, kiedy będzie gotowy. –

2

Poszukaj elementów na początkowej liście, które nie istnieją na liście odebranych: usuń je.

Poszukaj elementów na liście, których nie ma na liście początkowej: dodaj je.

EDYCJA: spójrz na this codeproject resource, pokazujący algorytm różnicowy.

+0

Działa to tak długo, jak długo zamówienie nie ma znaczenia. –

+0

Zamówienie ma znaczenie w moim przypadku. –

+0

@NeoLegends Zobacz link w edycji. –

Powiązane problemy