C#'ta nesnelerin genel bir listesine sahibim ve listeyi klonlamak istiyorum. Liste içindeki öğeler klonlanabilir, ancak list.Clone()
yapmak için bir seçenek yok gibi görünüyor.
Bunu aşmanın kolay bir yolu var mı?
Öğeleriniz değer türleriyse, o zaman sadece yapabilirsiniz:
List<YourType> newList = new List<YourType>(oldList);
Ancak, bunlar referans tipleriyse ve derin bir kopya istiyorsanız (öğelerinizin ICloneable
ı düzgün bir şekilde uyguladığını varsayarak), şöyle bir şey yapabilirsiniz:
List<ICloneable> oldList = new List<ICloneable>();
List<ICloneable> newList = new List<ICloneable>(oldList.Count);
oldList.ForEach((item) =>
{
newList.Add((ICloneable)item.Clone());
});
Açıkçası, yukarıdaki jeneriklerde ICloneable
yerine ICloneable
uygulayan eleman tipiniz ne ise onu yazın.
Eğer eleman tipiniz ICloneable
ı desteklemiyorsa ama bir kopyalama yapıcısına sahipse, bunun yerine bunu yapabilirsiniz:
List<YourType> oldList = new List<YourType>();
List<YourType> newList = new List<YourType>(oldList.Count);
oldList.ForEach((item)=>
{
newList.Add(new YourType(item));
});
Şahsen, tüm üyelerin derin bir kopyasını garanti etme ihtiyacı nedeniyle ICloneable
dan kaçınırdım. Bunun yerine, copy-constructor veya YourType.CopyFrom(YourType itemToCopy)
gibi yeni bir YourType
örneği döndüren bir fabrika yöntemi öneririm.
Bu seçeneklerden herhangi biri bir yöntem (uzantı veya başka türlü) tarafından sarılabilir.
Sığ bir kopya için, bunun yerine genel List sınıfının GetRange yöntemini kullanabilirsiniz.
List<int> oldList = new List<int>( );
// Populate oldList...
List<int> newList = oldList.GetRange(0, oldList.Count);
Alıntı: Generics Recipes
Eğer sadece değer türlerini önemsiyorsanız...
Ve bu tipleri bilirsin:
List<int> newList = new List<int>(oldList);
Daha önce türü bilmiyorsanız, bir yardımcı fonksiyona ihtiyacınız olacaktır:
List<T> Clone<T>(IEnumerable<T> oldList)
{
return newList = new List<T>(oldList);
}
Sadece:
List<string> myNewList = Clone(myOldList);