如何在不影响第一个List的情况下复制List



我尝试复制一个列表,但是当我更改第二个列表时,第一个列表与第二个列表一起更改。

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, };

等。

相关内容

最新更新