我有这个代码来返回我们组织的资金来源列表。
Dim FundSourceList As New List(Of FundSource)
Dim fs As New FundSource
If results.Count > 0 Then
For Each result In results
fs.FundID = result.Item("strFundID")
fs.FundDescription = result.Item("txtFundIDDescr")
fs.ShortFundDescription = result.Item("txtFundIDDescrShort")
FundSourceList.Add(fs)
Next
End If
Return FundSourceList
问题在于,当我遍历生成的FundSourceList时,它显示的是最后一个值。例如,如果我有三个基金来源(州,联邦,运动员),那么当我使用这个代码循环时,我列出的就是运动,运动,运动。
For Each FundSource In FundSources
Debug.Print(FundSource.FundDescription)
Next
所以我将代码更改为此。我在循环中移动了fs变量的创建。
Dim results = From result In dsResult.Tables(0) Select result
Dim FundSourceList As New List(Of FundSource)
If results.Count > 0 Then
For Each result In results
Dim fs As New FundSource
fs.FundID = result.Item("strFundID")
fs.FundDescription = result.Item("txtFundIDDescr")
fs.ShortFundDescription = result.Item("txtFundIDDescrShort")
FundSourceList.Add(fs)
Next
End If
Return FundSourceList
这很好但现在我正在一遍又一遍地创建一个新类。这对我来说似乎有点低效。我可以不在循环外创建类并一遍又一遍地使用它吗?感谢。
答案 0 :(得分:1)
如果您有3个基金来源,则需要三个FundSource对象。就这么简单。我不知道它的效率低......
如何在列表中添加3个基金来源,只需创建一个?
答案 1 :(得分:0)
您实际上并没有创建类 - 该类是方法和属性的代码定义。当您使用New操作时,您正在创建该类的实例,从而生成一个对象。当您有一个对象列表(如FundSourceList)时,您希望其中的项目是单个对象。所以是的,您在底部的解决方案是正确的。你提到了效率问题 - 当你实例化对象时,基本上所有发生的事情(在这种情况下)是一些内存被分配来存储变量(以及一些托管内存的引用,但你不必担心这个这里)。这是必要的,并且在引擎盖下进行了优化,因此您也不必担心这一点。
答案 2 :(得分:0)
您无法在循环外实例化对象以获得您所追求的结果。
这是因为您的对象是引用类型。
通过在循环外部实例化,您可以为对象创建一个引用。
在迭代结果并设置属性时,您将反复使用相同的引用。
在每次迭代中添加到列表中的所有内容都是相同的引用,在循环结束时,它将引用包含结果集中最后一个值的对象。
通过在循环内创建新对象,您可以创建新的引用 - 每个引用都指向一个新的FundSource。你的循环现在写入一个新的对象,并获得你想要的结果。