List.Count返回0

时间:2011-07-20 15:01:00

标签: vb.net .net-3.5 generic-list

我正在尝试将SQL查询的结果读入List(Of),我可以在向List增量添加项目的同时看到List.count,但是当我尝试阅读时,我的代码的另一部分列出List.Count返回0。

我的清单如下:

Public Class roomList
    Public Sub New()
    End Sub

    Public Property eName() As String
        Get
            Return _eName
        End Get
        Set(ByVal value As String)
            _eName = value
        End Set
    End Property
    Public Property eID() As Integer
        Get
            Return _eID
        End Get
        Set(ByVal value As Integer)
            _eID = value
        End Set
    End Property
    Public Property eEmail() As String
        Get
            Return _eEmail
        End Get
        Set(ByVal value As String)
            _eEmail = value
        End Set
    End Property
    Private _eID As Integer
    Private _eName As String
    Private _eEmail As String
End Class

我正在将SQL结果读入列表,如下所示: 编辑:这段代码在它自己的Sub()。

Dim rooms As New List(Of roomList)    
While dr.Read
      rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
      MsgBox(rooms.Count)
    End While

然后我尝试按如下方式读取List的计数: 编辑:这段代码在它自己的Sub()。

Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)

任何人都可以帮我理解为什么List返回0,并帮助我修复代码以便正确调用列表?

我感谢任何人能提供的帮助,如果您需要任何进一步的信息,请随时与我联系。

马特

编辑:我试图读取/写入List的两段代码都在它们自己的Sub中,我是否应该声明一个全局变量?

第一个Sub如下:

Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        Try
            getRoomList()
            Dim rooms As New List(Of roomList)()
            Dim r As roomList
            MsgBox(rooms.Count)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

调用getRoomList()子:

Private Sub getRoomList()
        Dim rooms As New List(Of roomList)
        Try
        ' SQL Query stuff goes here
                dr = sqlCmd.ExecuteReader
                While dr.Read
                    rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})
                    'MsgBox(rooms.Count)
                End While
            End If
        Catch ex As Exception

        End Try
    End Sub

4 个答案:

答案 0 :(得分:3)

这有效:

Dim rooms As New List(Of roomList)    
While dr.Read      
rooms.Add(New roomList() With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})      
MsgBox(rooms.Count)    
End While
MsgBox(rooms.Count)

消除新房间的建立:

Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)

上面创建了一个新的列表对象,实际上它最初是空的。

根据你的编辑

你提到了

  

编辑:我试图读/写的两段代码   列表是在他们自己的Sub中,我是否应该声明一个   全局变量?

因为它们位于2个不同的子例程中,所以一个实例丢失,因此计数现在为0,因为您已经创建了一个新实例。您要做的是获取初始列表并将其传递给相关的子例程/函数。如果您打算修改该列表,请将其传递给ByRef,否则将其传递给ByVal。有这样的效果:

'code...
 PrintListCount(rooms)
'other code...

protected Sub PrintListCount(ByVal rooms as List(Of roomList))
MsgBox(rooms.Count)
end sub

这个例子有点可怕,因为你真的不需要按值传递整个列表来打印列表的数量。但我只是用它来向你展示如何通过列表室。

每次第二次编辑

您的getRoomList()函数未返回列表。如果没有返回适当的对象,您如何期望收集计数?将sub更改为函数:

Private Function getRoomList() As List(Of roomList)        
Dim rooms As New List(Of roomList)        
Try        ' SQL Query stuff goes here                
dr = sqlCmd.ExecuteReader                
While dr.Read                    
rooms.Add(New roomList() 
With {.eID = dr.Item("mId"), .eName = dr.Item("roomName"), .eEmail = dr.Item("roomEmail")})                    
'MsgBox(rooms.Count)                
End While            
End If        
Catch ex As Exception        
End Try   
return rooms 
End Function

在你的加载事件中:

Dim rooms as List(Of roomList)
rooms = getRoomList();

现在你有了一个合适的房间对象,你现在可以说:

MsgBox(rooms.Count)

您需要阅读有关传递对象,函数如何工作以及变量范围的信息。没有这些知识,你就会对自己造成更大的困难。

答案 1 :(得分:0)

这个片段:

Dim rooms As New List(Of roomList)()
MsgBox(rooms.Count)

确实总会显示0,因为您正在创建一个新列表并声明一个名为rooms的单独变量。

您尚未显示您在哪里调用 读取数据的代码(即上一个代码段)。

说实话,目前还不清楚所有这些代码的执行位置。如果您可以提供简短但完整的程序来演示问题,那将会有很大帮助。当我们只能看到片段时,很难很好地理解整个程序流程。

答案 2 :(得分:0)

从第二个代码段开始,是什么让您认为您使用的是同一个列表?您在新的Dim'd变量上创建了New List(Of roomList)实例。要修复此代码,我们需要知道这两个代码段是如何相关的。

答案 3 :(得分:0)

一些可能性:

如果您在代码中声明两次房间列表,则第二个声明将创建一个新的计数0房间列表,并基本上擦除前一个列表。根据您发布的内容,可能会发生的事情。

如果数据源中没有房间,读者可能会返回0个房间。

房间变量的范围错误。 n将其范围增加到模块,类或更高级别,以便两个子访问同一个变量,而不是两个不同的变量。

另外,我会将计数移出循环。最后算一下吧。