2014-05-12 35 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, }; 

相关问题