2012-03-08 14 views

Trả lời

28

này sẽ không Clone mỗi mục trong danh sách, nhưng sẽ tạo cho bạn một danh sách

var new1 = new List<MyObject>(a1); 

mới Nếu bạn muốn sao chép mỗi Item trong danh sách bạn có thể thực hiện ICloneable trên MyObject

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

EDIT: Để làm cho nó một chút rõ ràng hơn cả hai sẽ sao chép các yếu tố từ danh sách a1 vào một danh sách mới. Bạn chỉ cần quyết định nếu bạn muốn có MyObject s mới hoặc giữ nguyên bản gốc. Nếu bạn muốn sao chép MyObject, bạn sẽ cần một cách để sao chép chúng thường được thực hiện thông qua ICloneable.

+6

Giải pháp của anh ta không xử lý tất cả các mặt hàng như thế nào? –

+1

var new1 = new List (a1); chỉ hoạt động với các loại giá trị, bạn nên cập nhật câu trả lời của mình. –

5

Hoặc, bạn có thể làm một cái gì đó như thế này:

public static class CloneClass 
{ 
    /// <summary> 
    /// Clones a object via shallow copy 
    /// </summary> 
    /// <typeparam name="T">Object Type to Clone</typeparam> 
    /// <param name="obj">Object to Clone</param> 
    /// <returns>New Object reference</returns> 
    public static T CloneObject<T>(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; 
    } 
} 

Sau đó sử dụng nó như:

var new1 = CloneClass.CloneObject<List<<MyObject>>(a1); 
+0

Bạn có quá nhiều "<". Nên > – user890332

1

Tôi nghĩ rằng việc thực hành nói chung là để tránh sử dụng Clone vì nó không phải là rõ ràng nếu đó là một nông vs Bản sao sâu của đối tượng.

Thông tin thêm về đó ở đây: http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx

Một giải pháp khá phổ biến đã được sử dụng lớp BinaryFormatter để serialize/derialize một đối tượng và trả lại ví dụ mới, nhưng với sự báo trước rằng lớp phải serializable:

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

Giả sử ở trên, bạn có thể làm:

var clonedList = originaList.DeepClone();