我尝试复制一个列表,但是当我更改第二个列表时,第一个列表与第二个列表一起更改。
My model class:
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; }
}
并更改了我的ball类:
//before:
//List<urunler> L2 = L1.Clone();
//after:
List<urunler> L2 = L1.Clone().toList();
你不是在复制一个列表,你是在对同一个列表进行新的引用。要复制List,请尝试这样做:
List<urunler> L2 = new List<urunler>(L1);
您可以使用ToList()
来创建一个副本/新列表
var L2 = L1.ToList();
如果你想创建一个新的列表,和创建单个列表项的副本,你需要在你的对象定义中添加一个'Clone'方法:
public class urunler : ICloneable
{
public Object Clone()
{
return this.MemberwiseClone();
}
}
:
var L2 = L1.Select(item => (urunler)item.Clone()).ToList();
你可以为它编写你的扩展方法:
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();
}
}
L2=L1错误就在这里。L2引用与L1相同的List。你需要创建一个新的List并复制这些项目:
L2 = new List<urunler>();
L1.CopyTo(L1);
//Edit: the above is wrong
L2 = new List<urunler>(L1);
您的类型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, };
等。