2009-11-12 163 views
1

为什么匿名类型属性“Points”仍然具有值“0”?使用匿名类型的Linq问题

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 
+0

直到现在,我还没有意识到VB.NET支持(作为选项)可变的匿名类型。 C#只支持不可变的匿名类型,我认为这是一个明智的决定。 – TrueWill 2009-11-12 18:35:33

回答

5

因为你query变量实际上代表查询,而不是实际的数据集。每当你枚举query时,它会再次执行该操作;您的声明(分配query变量)定义查询。枚举它执行它。看起来您想要做的是以列表的形式创建查询的内存中表示形式。你可以这样做:

Dim list = (From X In list Select New With {.Points = 0, X.ID}).ToList() 

For Each o In list 
    o.Points = 1 
Next 

这应该给你你期望的行为。

+0

谢谢!有效。 – Fernando 2009-11-12 18:31:13