添加项目到列表结果重复。什么是更好的方法?

时间:2009-07-29 13:11:12

标签: vb.net class list

我有这个代码来返回我们组织的资金来源列表。

    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

这很好但现在我正在一遍又一遍地创建一个新类。这对我来说似乎有点低效。我可以不在循环外创建类并一遍又一遍地使用它吗?感谢。

3 个答案:

答案 0 :(得分:1)

如果您有3个基金来源,则需要三个FundSource对象。就这么简单。我不知道它的效率低......

如何在列表中添加3个基金来源,只需创建一个?

答案 1 :(得分:0)

您实际上并没有创建类 - 该类是方法和属性的代码定义。当您使用New操作时,您正在创建该类的实例,从而生成一个对象。当您有一个对象列表(如FundSourceList)时,您希望其中的项目是单个对象。所以是的,您在底部的解决方案是正确的。你提到了效率问题 - 当你实例化对象时,基本上所有发生的事情(在这种情况下)是一些内存被分配来存储变量(以及一些托管内存的引用,但你不必担心这个这里)。这是必要的,并且在引擎盖下进行了优化,因此您也不必担心这一点。

答案 2 :(得分:0)

您无法在循环外实例化对象以获得您所追求的结果。

这是因为您的对象是引用类型。

通过在循环外部实例化,您可以为对象创建一个引用

在迭代结果并设置属性时,您将反复使用相同的引用。

在每次迭代中添加到列表中的所有内容都是相同的引用,在循环结束时,它将引用包含结果集中最后一个值的对象。

通过在循环内创建新对象,您可以创建新的引用 - 每个引用都指向一个新的FundSource。你的循环现在写入一个新的对象,并获得你想要的结果。