Abbiamo due elenchi, diciamo gli studenti e i loro punteggi. Voglio confrontare questi due elenchi e trovare il delta tra la nuova lista e la vecchia lista, quindi trovare il modo meno intrusivo di inserire o aggiornare nel nuovo elenco eventuali modifiche. Qual è il miglior algoritmo per avvicinarsi a questo? Vuoi concentrarti sulla quantità minima di modifiche apportate alla nuova lista e al rendimento.Qual è il pattern/algoritmo più efficiente per confrontare due liste e trovare il delta tra queste due liste?
codice Esempio:
List<ListItem> existingList = new List<ListItem>();
List<ListItem> newList = new List<ListItem>();
public TopLists()
{
InitTwoLists();
}
private void InitTwoLists()
{
existingList.Add(new ListItem { Name = "Shane", Score = 100 });
existingList.Add(new ListItem { Name = "Mark", Score = 95 });
existingList.Add(new ListItem { Name = "Shane", Score = 94 });
existingList.Add(new ListItem { Name = "Steve", Score = 90 });
existingList.Add(new ListItem { Name = "Brian", Score = 85 });
existingList.Add(new ListItem { Name = "Craig", Score = 85 });
existingList.Add(new ListItem { Name = "John", Score = 82 });
existingList.Add(new ListItem { Name = "Steve", Score = 81 });
existingList.Add(new ListItem { Name = "Philip", Score = 79 });
existingList.Add(new ListItem { Name = "Peter", Score = 70 });
newList.Add(new ListItem { Name = "Shane", Score = 100 });
newList.Add(new ListItem { Name = "Steve", Score = 96 }); // This is change
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Philip", Score = 79 });
newList.Add(new ListItem { Name = "Peter", Score = 70 });
}
}
public void CompareLists()
{
// How would I find the deltas and update the new list with any changes from old?
}
}
public class ListItem
{
public string Name { get; set; }
public int Score { get; set; }
}
** EDIT: uscita desiderata ***
L'output desiderato è quello di cambiare la realtà newList con delta. Ad esempio, in questo scenario:
newList.Add(new ListItem { Name = "Shane", Score = 100 });
newList.Add(new ListItem { Name = "Steve", Score = 96 }); // This is change
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Roger", Score = 80 }); // Roger is a new entry
newList.Add(new ListItem { Name = "Phillip", Score = 79 }); // Philip moved down one
// Peter cade questa lista con il suo punteggio di 70, perché voglio solo la top 10.
Così i cambiamenti sarebbero:
Aggiornamento record di 2 per "Steve", il punteggio è cambiato Inserire un nuovo record "Roger" nella posizione 9 record di goccia per "Peter" fuori della top 10.
Siete alla ricerca di una soluzione generale? O ci sono alcuni vincoli come un ordine specifico degli elenchi? –
Dovremmo presumere che gli elenchi saranno di dimensioni identiche? Vuoi anche trovare membri nella lista A che non sono nella lista B e viceversa? –
soluzione generale. le liste sarebbero sempre uguali. L'ordinamento è sempre il tipo di punteggio decrescente. – Shane