Nous avons deux listes, disons les étudiants et leurs scores. Je veux comparer ces deux listes et trouver le delta entre la nouvelle liste et l'ancienne liste, puis trouver le moyen le moins intrusif d'insérer ou de mettre à jour dans la nouvelle liste les changements. Quel est le meilleur algorithme pour aborder cela? Vous voulez vous concentrer sur le nombre minimal de modifications apportées à la nouvelle liste et à la performance.Quel est le modèle/algorithme le plus efficace pour comparer deux listes et trouver le delta entre ces deux listes?
code Exemple:
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: Débit désiré ***
La sortie souhaitée est réellement changer la newList avec les deltas. Par exemple, dans ce scénario:
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 tombe cette liste avec son score de 70, puisque je veux seulement le top 10.
Ainsi, les changements seraient:
Mise à jour fiche 2 pour "Steve", le score a changé Insérer nouveau record "Roger" à la position 9 enregistrement drop pour "Peter" hors du top 10.
Vous cherchez une solution générale? Ou y a-t-il certaines contraintes comme un ordre de tri spécifique des listes? –
Devrions-nous supposer que les listes seront de taille identique? Voulez-vous également trouver des membres dans la liste A qui ne figurent pas dans la liste B et vice versa? –
solution générale. les listes seraient toujours égales. L'ordre de tri est toujours le type de score décroissant. – Shane