【问题标题】:How to clone List<T> item correctly? [duplicate]如何正确克隆 List<T> 项目? [复制]
【发布时间】:2017-05-19 18:16:03
【问题描述】:

我在克隆列表项时遇到问题。

Class Item
{
String Name;
Int Age;
}

比我有一个列表

List<Item> Items = new List<Items>();

如果我现在做这个动作

Item val= Items[i];

现在如果我改变 val 的年龄,它也会改变 Items[i] 的年龄。 如何从列表中克隆项目,因此在更改克隆项目中的值时,列表中的值不会改变? 例如,如果我的班级更大,它包含超过 20 个值。

【问题讨论】:

  • @CircleHsiao 他问的是一项而不是全部List&lt;&gt;
  • m.rogalaski,没错。我只需要从 List 中获取一项。
  • “正确克隆”是一个失败的规范。对于您的 特定 类型,您需要构造一个新的 Item 并复制值。对于其他类型,答案可能会有所不同,因为您没有指定是需要浅层克隆还是深层克隆,或者根据数据混合使用浅层和深层。
  • 最好的方法是要么在你​​的类型上实现一个接口,将它如何复制自身的确切方式委托给该类型,要么给一个知道如何在特定的特定类型中复制特定类型的单独的工厂/克隆类上下文。

标签: c#


【解决方案1】:

类是一个引用类型。通过使用Item val= Items[i];,您只是将Items[i] 的引用分配给val,因此当您修改一个时,您就修改了另一个。

您需要创建一个新的Item 并从原始Item[i] 填充其属性:

var val = new Item()
{
    Name = Items[i].Name,
    Age = Items[i].Age
};

您可能还需要在您的 Item 类上设置正确的访问权限:

public class Item
{
    public string Name { get; set; }
    public int Age { get; set; }
}

【讨论】:

  • 我知道。但是我有一个包含 20 多个值的类。所以很难像这样克隆。
  • 嗯,也许这是你应该在你的问题中输入的一些信息......
  • 我们只能回答您发布的问题,而不是您应该发布的问题。克隆具有 2 个属性的类型的“最佳”方法可能不同于克隆具有 20+ 或 200+ 属性的类型。您最好发布一个您想要的示例,但也请发布一些有关您将应用该解决方案的实际场景的细节。例如,如果您的类型具有包含其他对象的属性,您是要克隆它们(深克隆)还是要复制它们,只克隆初始级别的属性(浅克隆)?跨度>
  • 我不明白你在浅克隆和深层克隆中的意思,但我可以说我需要克隆后克隆项目中断与源项目的所有通信。
【解决方案2】:
Item it = new Item();
it.Name = Items[i].Name;
it.Age = Items[i].Age;

创建Item 类的新对象并使用列表项初始化它的成员变量。同样为此设置成员变量 NameAgepublic 或通过公共属性公开它们。

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 2016-05-18
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2017-01-09
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多