2014-05-12 38 views
-3

我嘗試複製列表,但是當我更改第二個列表時,第一個列表隨第二個列表而更改。如何複製列表而不影響第一個列表

我的模型類:

public class urunler : ICloneable 
{ 
public int id { get; set; } 
public string icerik { get; set; } 
} 

擴展類:

using System.Collections.Generic; 
using System; 
using System.Linq; 

namespace Extensions 
{ 
    public static class Extensions { 

     public static IList<T> Clone<T>(this IList<T> SourceList) where T: ICloneable 
     { 
      return SourceList.Select(item => (T)item.Clone()).ToList(); 
     } 
    } 
} 

BLL類:

using System.Linq; 
using Extensions; 
public class bll 
{ 
    public void examp 
    { 
     List<urunler> L1 = new List<urunler>(); 
     urunler U = new urunler(); 
     U.icerik="old"; 
     L1.Add(U); 
     List<urunler> L2 = L1.Clone(); 
     L2[0].icerik="new"; 
     MessageBox.show(L1[0].icerik); 
     MessageBox.show(L2[0].icerik); 
     // 
    } 
} 

錯誤:

error CS0535: `urunler' does not implement interface member `System.ICloneable.Clone()' 

然後我嘗試改變模型類:

public class urunler : ICloneable 
{ 
    #region ICloneable implementation 

    IList<urunler> ICloneable.Clone() 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
    public int id { get; set; } 
    public string icerik { get; set; } 
} 

錯誤:

error CS0539: `System.ICloneable.Clone' in explicit interface declaration is not a member of interface 

它的工作原理這個時候,我改變了我的模型類

public class urunler : ICloneable 
{ 
    public object Clone()   
    {    
     return this.MemberwiseClone();   
    } 
    public int id { get; set; } 
    public string icerik { get; set; } 
} 

而且改變了我的BLL類:

//before: 
//List<urunler> L2 = L1.Clone(); 
//after: 
List<urunler> L2 = L1.Clone().toList(); 
+0

您正在複製引用。使用克隆方法或CopyTo方法或ctor與舊列表列表創建基於原始的依賴列表。 – icbytes

+0

已回答多次http://stackoverflow.com/a/222623/125740 – Yahya

+0

請做好您的研究。 – Yahya

回答

0

,你可以寫你的擴展方法吧:

public static class Extensions 
{ 
    public static IList<T> Clone<T>(this IList<T> SourceList) where T: ICloneable 
    { 
     return SourceList.Select(item => (T)item.Clone()).ToList(); 
    } 
} 

使用這樣的:

List<urunler> L2 = L1.Clone(); 

你的類:

public class urunler : ICloneable 
{ 
public int id { get; set; } 
public string ismi { get; set; } 
public string icerik { get; set; } 

public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

} 
+0

'CopyTo'拷貝到一個數組,而不是'List ' – Rik

+0

感謝您糾正我@Rik ... –

+0

我嘗試,但不工作myclass名稱例如:urunler'List str = new List ().Clone()//正在工作, 列表 urun =新列表().Clone()//不工作,擴展不會出現在點後面 – user1811872

1

你不是複製一個列表,你讓對同一個列表的新參考。要複製列表,請嘗試以下操作:

List<urunler> L2 = new List<urunler>(L1); 
0

L2 = L1這是錯誤。 L2正在引用與L1相同的列表。 你需要做一個新的列表和複製的項目:

L2 = new List<urunler>(); 
L1.CopyTo(L1); 
//Edit: the above is wrong 
L2 = new List<urunler>(L1); 
+0

'CopyTo'副本到一個數組,而不是'List ' – Rik

+0

你是對的。現在沒關係 –

+0

我嘗試過,但有錯誤。我改變'L1.CopyTo(L1.toArray());'但它不是我想要的 – user1811872

1

你可以使用ToList()創建副本/新列表

var L2 = L1.ToList(); 

如果你想創建一個新的列表,創建單獨的列表項的副本,你將需要一個「克隆」的方法添加到您的對象定義:

public class urunler : ICloneable 
{ 
    public Object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 
} 

然後:

var L2 = L1.Select(item => (urunler)item.Clone()).ToList(); 
+0

我嘗試但不創建新列表。問題是contineu :( – user1811872

0

你型urunler似乎是一個class,因此引用類型。你能告訴我們urunler班的定義嗎?

因此,即使你正確克隆列表,你仍然產生克隆。兩個不同的List<>實例將引用相同的urunler實例。

當你做L2 = L1;,你甚至不克隆List<>。你只有兩個參考List<>,以便在早期出現問題。

當你做L2 = new List<urunler>(L1);L2 = L1.ToList();L2 = new List<urunler>(); L2.AddRange(L1);,你會得到我描述的淺拷貝。有兩個不同的參考列表,但它們指的是同一個實例urunler

考慮Dave Bish的答案的編輯版本的克隆解決方案。

根據您的語義,你也可以讓urunler不變型。然後,而不是東西,如:

L2[0].icerik = "new"; 

你必須做的:

L2[0] = new urunler { icerik = "new", OtherProp = L2[0].OtherProp, }; 

相關問題