更新列表中对象的属性,并将其添加到另一个列表,而无需使用LINQ编辑原始列表

时间:2013-10-28 19:25:50

标签: .net vb.net linq

我想将对象从一个列表复制到另一个列表并编辑它们而不改变原始列表。

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()扩展名。

1 个答案:

答案 0 :(得分:2)

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

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

myList2.AddRange(myList.Select(Function(x) new myObject With { .foo = x.foo, .bar = x.bar, .baz = 1 }))