0

我想将对象从一个列表复制到另一个列表中并在不更改原始列表的情况下对其进行编辑。

Dim myList1 as New List(Of myObject)
myList1.Add(New myObject() With {.foo = 1, .bar = 0, .baz = 0})

Dim myList2 as New List(Of myObject)
myList2.AddRange(myList.Select(Function(x) x.bar = 1))
myList2.AddRange(myList.Select(Function(x) x.baz = 1))

期望myList2

{.foo = 1, .bar = 1, .baz = 0}, {.foo = 1, .bar = 0, .baz = 1}

实际myList2

{.foo = 1, .bar = 1, .baz = 0}, {.foo = 1, .bar = 1, .baz = 1}

我究竟做错了什么?

我很难相信 LINQ 本身不能做到这一点,而且我必须编写一个自定义.Clone()扩展,就像这篇 SO 帖子推荐的那样。

4

1 回答 1

2

因为您的类型是引用类型,LINQ 不会复制实例,它只会复制引用。因此,两个列表都包含对同一实例的引用,myObject这就是您看到这种输出的原因。

您可以编写自己的方式来克隆对象(例如 implement ICloneable)或将您的 LINQ 查询更改为以下内容:

myList2.AddRange(myList.Select(Function(x) new myObject With { .foo = x.foo, .bar = x.bar, .baz = 1 }))
于 2013-10-28T19:31:05.513 回答