2015-09-09 13 views
7

immagino hanno un elenco di elementi:modifiche replicarsi in un elenco

 
- A 
- B 
- C 

Ora da qualche parte un server indica la mia applicazione quell'elemento B è stato rimosso, tuttavia fornisce solo l'intera nuova lista, non il cambiamento esatto dettagli. Poiché WinRT ListView s animano automaticamente l'aggiunta, la rimozione e lo spostamento di oggetti al loro interno, preferirei non aggiornare l'elenco di accompagnamento e richiamare un Reset- INotifyCollectionChanged -event, poiché questo rende ogni elemento apparentemente piuttosto smussato e ruvido. Invece, voglio calcolare i passaggi necessari per trasformare la mia lista locale nella lista che ottengo dal server. (Un po 'come una distanza di levenshtein, solo non con il conteggio dei passi ma con i passi stessi)

e. g .:

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

Come faccio?

MODIFICA: Ordine importa nel mio caso.

+2

Si potrebbe guardare algoritmi diff - https://en.wikipedia.org/wiki/Diff_utility –

risposta

3

In base al titolo della pagina, suggerito da MihaiCaracostea, sono riuscito a trovare un algoritmo diff funzionante su qualsiasi IList<T>. Utilizza anche yield per calcolare la differenza mentre si enumerano le modifiche.

L'articolo può essere trovato here, il codice sorgente effettivo (se non si desidera leggere come è fatto) è here.

Attenzione però, l'algoritmo viene eseguito in tempo O (n²). Certamente c'è spazio per miglioramenti in quell'area.

+1

Ottimo post, amico! –

+0

@MihaiCaracostea Sì, è un momento in cui sia la domanda che la risposta meritano l'upvoting :) –

+0

Attualmente sto mettendo tutto quel codice (compresi alcuni metodi aggiuntivi per trasformare una lista in un'altra) in una libreria NuGet. Pubblicherò il link qui quando è fatto. –

2

Cercare elementi nell'elenco iniziale che non esistono nell'elenco di ricezione: rimuoverli.

Cerca elementi nell'elenco di quelli che non esistono nell'elenco iniziale: aggiungili.

MODIFICA: dare un'occhiata a this codeproject resource, mostrando un algoritmo di diff.

+0

Questo funziona fino a quando l'ordine non importa. –

+0

L'ordine conta nel mio caso. –

+0

@NeoLegends Vedi il link nella modifica. –

Problemi correlati