【问题标题】:List.Count Returns 0List.Count 返回 0
【发布时间】:2011-07-20 15:01:00
【问题描述】:

我正在尝试将 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 结果读取到列表中,如下所示: 编辑:这段代码的 sn-p 在它自己的 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

然后我尝试读取列表的计数,如下所示: 编辑:这段代码的 sn-p 在它自己的 Sub() 中。

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

谁能帮我理解为什么 List 返回计数为 0,并帮助我修复代码以便正确调用列表?

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

马特

编辑:我试图读/写 List 的两个 sn-ps 代码都在它们自己的 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

【问题讨论】:

  • 在 while 循环期间是否收到消息框?
  • 您要两次申报房间吗?您的示例代码当然有两个声明。
  • 根据您的编辑,房间变量的范围有误。听起来它具有方法级别(子函数)范围而不是类。如果房间需要在 Subs 之间共享,那么它的范围应该在更高的级别。
  • @Lima,根据您在下面的帖子中的编辑查看我的编辑。
  • @Lima - 当你真正需要 function 时,你正在使用 sub。您需要在getRoomList 内创建rooms 对象并将其返回给您的调用方法。没有它,房间就毫无意义。

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


【解决方案1】:

这行得通:

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)

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

根据您的编辑

你提到了

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

因为它们位于 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)

您需要了解传递对象、函数如何工作以及变量范围。没有这些知识,你会让自己变得更加困难。

【讨论】:

  • 非常感谢 JonH,您的信息帮助了我很多。我将看看如何实现 List 的 ByRef 传递。
  • @Lima - 或者您可以简单地从 getRoomList() 函数返回列表并将其分配给调用代码内的本地 room 变量。
  • 谢谢,我刚刚看到您的进一步编辑,非常喜欢。我已经修改了我的代码,现在它工作得很好。非常感谢您对我的问题的帮助和耐心。你很好地解释了这个问题。
  • @Lima - 没问题,如果它解决了您的问题,请将答案标记为“已接受”。
  • @JonH:您写道:“如果您打算修改该列表,请通过 ByRef,否则请通过 ByVal”。这句话中的“修改”是什么意思?如果您的意思是更改变量指向的列表,那么您是正确的。如果您的意思是在列表中添加和删除项目,则无需通过 ByRef
【解决方案2】:

这个sn-p:

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

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

你没有显示你在哪里调用 读取数据的代码(即之前的 sn-p)。

说实话,目前还不清楚所有这些代码在哪里执行。如果您可以提供一个简短但完整的程序来演示该问题,那将有很大帮助。当我们只能看到 sn-ps 时,很难很好地了解整个程序流程。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      一些可能性:

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

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

      房间变量的范围错误。 nN将其范围扩大到模块、类或更高级别,以便两个子程序访问同一个变量,而不是两个不同的变量。

      另外,我会将计数移出循环。算在最后就行了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-08
        • 2016-10-30
        • 1970-01-01
        • 2015-06-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2015-06-21
        相关资源
        最近更新 更多