J’ai 2 listes d’un type d’object:
List list1;
List list2;
Quel est le meilleur moyen (performance et code propre) d’extraire les différences de données entre ces deux listes?
Je veux dire obtenir des objects qui sont ajoutés, supprimés ou modifiés (et le changement)?
Essayez Except
avec Union
, mais vous devrez le faire pour les deux afin de trouver des différences entre les deux.
var exceptions = list1.Except(list2).Union(list2.Except(list1)).ToList();
OU comme alternative à Linq, il pourrait y avoir une approche beaucoup plus rapide: HashSet.SymmesortingcExceptWith ():
var exceptions = new HashSet(list1); exceptions.SymmesortingcExceptWith(list2);
IEnumerable differenceQuery = list1.Except(list2);
Vous pouvez utiliser FindAll
pour obtenir le résultat souhaité, même si IEquatable
ou IComparable
implémenté dans votre MyClass
. Voici un exemple:
List interetedList = list1.FindAll(delegate(MyClass item1) { MyClass found = list2.Find(delegate(MyClass item2) { return item2.propertyA == item1.propertyA ...; } return found != null; });
De la même manière, vous pouvez obtenir vos articles intéressés de list2
en comparant à list1
.
Cette stratégie peut également contenir vos éléments “modifiés”.
Une façon d’obtenir les éléments qui se trouvent dans list1 ou list2 mais pas dans les deux serait:
var common = list1.Intersect(list2); var exceptions = list1.Except(common).Concat(list2.Except(common));
Essayez ceci pour la comparaison d’objects et faites-le en boucle pour la List
public static void GetPropertyChanges(this T oldObj, T newObj) { Type type = typeof(T); foreach (System.Reflection.PropertyInfo pi in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) { object selfValue = type.GetProperty(pi.Name).GetValue(oldObj, null); object toValue = type.GetProperty(pi.Name).GetValue(newObj, null); if (selfValue != null && toValue != null) { if (selfValue.ToSsortingng() != toValue.ToSsortingng()) { //do your code } } } }