【问题标题】:C# copy List<dynamic> without reference [duplicate]C# 复制 List<dynamic> 没有引用 [重复]
【发布时间】:2017-12-18 08:58:19
【问题描述】:

我有一个需要复制的List&lt;dynamic&gt;,然后根据列表行的条件,我需要修改该行的一个字段并将其添加到第二个列表中。

这是代码示例:

//list1 is a `List<dynamic>` that I get from a query using Dapper. I guess it is an ExpandoObject list

var list2 = new List<dynamic>(list1);

foreach (var obj in list2)
{
     if (obj.condition == 1)
     {
         var newObj = obj;
         newObj.description = "new row";
         list2.Add(newObj);
     }
}

我的问题是,在我的两个列表中,列表中的 obj 都使用字符串“新行”进行了更新。

似乎每次我更改 newObj 时,两个列表都会更新。

我也尝试以这种方式创建我的list2,但我遇到了同样的问题:

var list2 = new BindingList<dynamic>(list1);

编辑:

我查看了其他问题,但就我而言,我只有一个 dynamic 列表。无需创建Class 并实现ICloneable,是否可以获得我想要的结果?

【问题讨论】:

  • 实现 ICloneable 并可能调用var list2 = list1.Select(i =&gt; i.Clone()).ToList()
  • 但在实现中操作必须编写大致相同的代码
  • 好吧,虽然有两个不同的列表,但这些列表中的 elements 是相同的,因此修改一个列表中的任何元素 surley 会将另一个列表中的元素修改为好吧。
  • @SilentRage47 您想克隆该对象,但您无权访问它?好吧,也许您可​​以使用扩展方法,尽管这可能会变成混乱的反射,具体取决于东西的可见性。
  • 如果不了解您的实际对象,就不可能克隆它们。请参阅此处以获取更多说明:stackoverflow.com/questions/12602152/…

标签: c# list


【解决方案1】:

试试

var list2 = list1.Select(x => x);

【讨论】:

  • 我试过了,但结果是一样的。两个列表都已更新。
  • @SilentRage47,当你说list.Add(newObj)时,你添加到哪个列表中
  • list2,我更正了代码示例。
  • @praty 我认为这只适用于值类型,动态应该是引用类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2013-08-29
  • 2020-03-28
  • 2020-03-26
  • 2019-11-24
  • 2018-01-01
相关资源
最近更新 更多