Comment faire le bon clone de la liste ?

Dupliquer possible:
Comment cloner une liste générique en C #?

List a1 = new List(); var new1 = a1; 

Maintenant, si je change a1 new1 va aussi être changé.

Ma question est donc de savoir comment créer correctement un clone de a1 ?

Cela ne Clone pas chaque élément de la liste mais vous créera une nouvelle liste

 var new1 = new List(a1); 

Si vous souhaitez cloner chaque élément de la liste, vous pouvez implémenter ICloneable sur MyObject

 var new1 = new List(a1.Select(x => x.Clone())); 

EDIT: Pour que ce soit un peu plus clair, les deux copieront les éléments de la liste a1 dans une nouvelle liste. Vous devez simplement décider si vous souhaitez disposer de nouveaux MyObject ou conserver les originaux. Si vous voulez cloner MyObject vous aurez besoin d’un moyen de les cloner, généralement via ICloneable .

Ou, vous pouvez faire quelque chose comme ça:

 public static class CloneClass { ///  /// Clones a object via shallow copy ///  /// Object Type to Clone /// Object to Clone /// New Object reference public static T CloneObject(this T obj) where T : class { if (obj == null) return null; System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); if (inst != null) return (T)inst.Invoke(obj, null); else return null; } } 

Alors utilisez-le comme:

 var new1 = CloneClass.CloneObject>(a1); 

Je pense que la pratique générale est d’éviter d’utiliser Clone, car il n’est pas clair s’il s’agit d’une copie peu profonde ou profonde de l’object.

Plus d’informations à ce sujet ici: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx

Une solution assez courante a été d’utiliser la classe BinaryFormatter pour sérialiser / dérialiser un object et renvoyer la nouvelle instance, mais avec l’avertissement que la classe doit être sérialisable:

https://stackoverflow.com/a/1213649/1212407

En supposant ce qui précède, vous pourriez faire:

 var clonedList = originaList.DeepClone();