2010-08-25 4 views

Répondre

3

Cela dépend de ce que vous voulez.

  • Pour créer un instantané de la collection, vous pouvez simplement appeler IEnumerable<T>.ToList.
  • Si vous souhaitez également créer un instantané de la liste et de chaque objet de la liste, vous devez également créer une copie distincte de chaque objet. La meilleure façon de faire une copie dépend du type spécifique de votre collection. Certains types ont une méthode Clone. Avec d'autres, vous pouvez appeler un constructeur. Certains types ne peuvent pas être facilement copiés.

Exemple:

List<Foo> snapshot = foos.Select(x => new Foo(x)).ToList(); 

Pour vérifier si deux IEnumerable<T> s sont égaux (à savoir vérifier qu'il n'y a pas de changement), vous pouvez utiliser SequenceEqual. Vous devrez également spécifier un IEqualityComparer si votre classe n'implémente pas Equals comme vous le souhaitez.

Si vous voulez avoir un moyen efficace de trouver un élément spécifique dans l'instantané de son champ id alors au lieu d'une liste que vous pouvez utiliser un Dictionary<K, V>. Appelez IEnumerable<T>.ToDictionary pour créer un dictionnaire à partir de votre collection.

+0

+1 pour SequenceEqual –

0

Etes-vous en train d'essayer de vérifier la collection ou chaque membre individuel? Une approche consiste à utiliser un ObservableCollection<T>. Vous pouvez vous abonner aux événements qui sont déclenchés chaque fois que la collection est modifiée. Les arguments d'événement indiquent l'élément et le type de changement.

+0

La collection, par défaut. – Berryl

4

Si vous voulez juste enregistrer un instantané et vérifier si la taille de votre liste change (article ajouté/supprimé)

var snapshot = new List<Foo>(list); 

Toutefois, si vous modifiez les éléments énumérés et que vous souhaitez vérifier si les éléments ont changé, vous devrez cloner chaque élément. Si vous les insérez dans une autre liste, les références devraient rester identiques.

var snapshot = list.Select(item => new Foo 
            { 
             Property1 = item.Property1, 
             ... , 
             PropertyN = item.PropertyN 
            }); 

Si vous voulez juste voir si le nombre de la liste change, vous pouvez utiliser la première version.

Peut-être que vous avez un identifiant sur vos objets qui simplifie la solution à quelque chose comme

var snapshot = list.Select(item => item.Id); 

La liste des ID peut être utilisée pour voir si le contenu a changé. Ce modèle serait utile si vos objets sont gros sur l'utilisation de la mémoire, aussi.

Cependant, vous pouvez utiliser un ObservableCollection<T> qui a des événements à vous informer des modifications. De cette façon, vous pouvez suivre toutes les modifications apportées à la collection (ajouter/supprimer/remplacer).