我想将对象从一个列表复制到另一个列表中并编辑它们而不更改原始列表。
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()
扩展,就像这篇文章推荐的那样。
由于您的类型是引用类型,因此 LINQ 不会创建实例的副本,而只会复制引用。因此,这两个列表都包含对同一myObject
实例的引用,这就是您看到这种输出的原因。
您可以编写自己的方法来克隆对象(例如实现ICloneable
)或将 LINQ 查询更改为以下内容:
myList2.AddRange(myList.Select(Function(x) new myObject With { .foo = x.foo, .bar = x.bar, .baz = 1 }))