gpt4 book ai didi

c# - 克隆列表

转载 作者:IT王子 更新时间:2023-10-29 04:26:13 24 4
gpt4 key购买 nike

我认为要克隆一个列表,您只需调用:

List<int> cloneList = new List<int>(originalList);

但我在我的代码中尝试过,我似乎得到的效果暗示上面只是在做:

cloneList = originalList... 因为对 cloneList 的更改似乎影响了 originalList。

那么如何克隆一个List呢?

编辑:

我正在考虑做这样的事情:

public static List<T> Clone<T>(this List<T> originalList) where T : ICloneable
{
return originalList.ConvertAll(x => (T) x.Clone());
}

编辑2:

我采用了 Binoj Antony 建议的深度复制代码并创建了这个扩展方法:

public static T DeepCopy<T>(this T original) where T : class
{
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, original);
memoryStream.Seek(0, SeekOrigin.Begin);
return (T)binaryFormatter.Deserialize(memoryStream);
}
}

编辑3:

现在,假设列表中的项目是结构。如果我打电话,结果会怎样?:

List<StructType> cloneList = new List<StructType>(originalList);

我很确定我会得到一个包含新的独特项目的列表,对吗?

最佳答案

这会工作...

List<Foo> cloneList = new List<Foo>(originalList);

当您说“因为对 cloneList 的更改似乎影响了 originalList”。 - 你是说改变列表,还是改变items...

添加/删除/交换项目正在改变列表 - 所以如果我们这样做:

cloneList.Add(anotherItem);

你应该发现 cloneListoriginalList 长。然而,如果内容是引用类型(类),那么两个列表仍然指向相同的底层对象 - 所以如果我们这样做:

cloneList[0].SomeObjectProperty = 12345;

那么这也会针对 originalList[0].SomeObjectProperty 显示 - 只有一个对象(在两个列表之间共享)。

如果这是问题所在,您将不得不克隆列表中的对象 - 然后您会陷入整个深度与浅层问题...这是问题所在吗?

对于浅拷贝,您可以使用非常类似于答案 here 的东西- 简单地使用 TTo = TFrom(可能简化为单个 T)。

关于c# - 克隆列表<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/519461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com