List.Count Возвращает 0 - PullRequest
       31

List.Count Возвращает 0

1 голос
/ 20 июля 2011

Я пытаюсь прочитать результаты SQL-запроса в List (Of), и я вижу List.count при добавлении элементов к приращениям List, однако в другой части моего кода, когда я пытаюсь прочитать Список 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

Затем я пытаюсь прочитать счет в списке следующим образом: РЕДАКТИРОВАТЬ: этот фрагмент кода находится в своем собственном Sub ().

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

Может ли кто-нибудь помочь мне понять, почему List возвращает счетчик 0, и помочь мне исправить код, чтобы список вызывался правильно?

Я ценю любую помощь, которую может предложить каждый, и, если вам нужна дополнительная информация, пожалуйста, не стесняйтесь обращаться ко мне.

Мэтт

РЕДАКТИРОВАТЬ: два фрагмента кода, в котором я пытаюсь прочитать / записать список, находятся в их собственных подпрограммах, я должен вместо этого объявить глобальную переменную?

Первый 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 ]

3 голосов
/ 20 июля 2011

Это работает:

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() не возвращает список.Как вы ожидаете, чтобы собрать счет без надлежащего возвращенного объекта?Измените саб на функцию:

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)

Вам нужно будет прочитать о проходящих объектах, о том, как работают функции, и переменной области видимости.Без этого знания ты усложняешь себе жизнь.

0 голосов
/ 20 июля 2011

Из второго фрагмента кода, что заставляет вас думать, что вы используете тот же список?Вы создали экземпляр New List (Of roomList) для новой переменной Dim'd.Чтобы исправить этот код, нам нужно знать, как связаны эти два фрагмента.

0 голосов
/ 20 июля 2011

Некоторые возможности:

Если вы объявляете список номеров дважды в коде, 2-е объявление создаст новый список номеров с номером 0 и в основном сотрет предыдущий список.Исходя из того, что вы опубликовали, это может быть тем, что происходит.

Читатель может вернуть 0 комнат, если в источнике данных нет комнат.

Переменная комнат имеет неверную область,Увеличьте область видимости модуля, класса или выше, чтобы оба подпрограммы обращались к одной и той же переменной, а не к двум разным.

Кроме того, я бы переместил счетчик из цикла.Просто посчитай это в конце.

0 голосов
/ 20 июля 2011

Ну этот фрагмент:

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

действительно всегда будет показывать 0, потому что вы создаете новый список и объявляете отдельную переменную с именем rooms.

Вы не указали, где вы вызываете код, который читает данные (т. Е. Предыдущий фрагмент).

Если честно, неясно, где выполняется весь этот код. Если бы вы могли представить короткую, но завершенную программу, демонстрирующую проблему, это очень помогло бы. Когда мы можем видеть только фрагменты, трудно понять, как работает программа в целом.

...