.net 使用匿名类型的Linq存在问题
为什么匿名类型属性点的值仍然为0.net 使用匿名类型的Linq存在问题,.net,vb.net,linq,anonymous-types,.net,Vb.net,Linq,Anonymous Types,为什么匿名类型属性点的值仍然为0 Public Class Test Public Sub New(ByVal _ID As Integer) ID = _ID End Sub Public ID As Integer End Class Dim list As New List(Of Test) list.Add(New Test(1)) list.Add(New Test(2)) list.Add(New Test(3)) Dim query =
Public Class Test
Public Sub New(ByVal _ID As Integer)
ID = _ID
End Sub
Public ID As Integer
End Class
Dim list As New List(Of Test)
list.Add(New Test(1))
list.Add(New Test(2))
list.Add(New Test(3))
Dim query = From X In list Select New With {.Points = 0, X.ID}
For Each o In query
o.Points = 1
Next
因为您的查询变量实际上代表一个查询,而不是一组实际的数据。每次枚举over query时,它将再次执行该操作;分配查询变量的声明定义了查询。枚举它将执行它。看起来您想要做的是以列表的形式创建查询的内存中表示。您可以这样做:
Dim list = (From X In list Select New With {.Points = 0, X.ID}).ToList()
For Each o In list
o.Points = 1
Next
这将提供您所期望的行为。因为您的查询变量实际上代表一个查询,而不是一组实际的数据。每次枚举over query时,它将再次执行该操作;分配查询变量的声明定义了查询。枚举它将执行它。看起来您想要做的是以列表的形式创建查询的内存中表示。您可以这样做:
Dim list = (From X In list Select New With {.Points = 0, X.ID}).ToList()
For Each o In list
o.Points = 1
Next
这应该会提供您期望的行为。直到现在,我才意识到VB.NET支持可变匿名类型作为选项。C只支持不可变的匿名类型,我认为这是一个明智的决定。直到现在我才意识到VB.NET支持可变的匿名类型。C只支持不可变的匿名类型,我认为这是一个明智的决定。