Obtenir les différences entre deux listes

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); 

http://msdn.microsoft.com/en-us/library/bb397894.aspx

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 } } } }