我想将对象从一个列表复制到另一个列表并编辑它们而不改变原始列表。
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本身不能这样做,而且我必须编写this SO post recommends之类的自定义.Clone()
扩展名。
答案 0 :(得分:2)
因为你的类型是引用类型LINQ不会复制实例,所以它只会复制引用。因此,这两个列表都包含对同一myObject
实例的引用,这就是您看到这种输出的原因。
您可以编写自己的克隆对象的方法(例如实现ICloneable
)或将LINQ查询更改为以下内容:
myList2.AddRange(myList.Select(Function(x) new myObject With { .foo = x.foo, .bar = x.bar, .baz = 1 }))