vb.net — добавить объект в arraylist

#vb.net #arrays #object #arraylist

#vb.net #массивы #объект #список массивов

Вопрос:

У меня возникли некоторые проблемы с добавлением объекта в список массивов.

По сути, объект имеет два свойства (идентификатор / имя файла), но я не могу понять, как назначить эти свойства. Во время выполнения он выдает ошибку с открытым членом для объекта, который не найден.

 Private QueueList As New ArrayList
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
    Dim QueueObj As New Object
    QueueObj.FileID = "Test 1"
    QueueObj.FileName = "Test 2"
    QueueList.Add(QueueObj)
End Sub
  

Я также хотел бы знать, как я могу выполнить цикл в arraylist и получить доступ к двум свойствам в каждой записи.

Спасибо!

Комментарии:

1. Почему вы используете arraylist?? Используйте список для этой работы.

Ответ №1:

Вы не можете просто использовать «Объект» для этого. Вам нужно создать свой собственный класс:

 Public Class File
    Public Property FileID As Integer
    Public Property FileName As String
    Public Sub New ()
    End Sub
    Public Sub New(ByVal FileName As String, ByVal FileID As Integer)
        Me.FileID = FileID
        Me.FileName = FileName
    End Sub
End Class
  

А затем создайте свою очередь следующим образом:

 Private QueueList As New ArrayList()
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
    QueueList.Add(New File(FileName, FileID))
End Sub
Public Sub Queue(ByVal FileObj As File)
    QueueList.Add(FileObj)
End Sub
  

Или, что еще лучше, используйте дженерики:

 Public QueueList As New List(Of File)()
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
    QueueList.Add(New File(FileName, FileID))
End Sub
Public Sub Queue(ByVal FileObj As File)
    QueueList.Add(FileObj)
End Sub
  

Затем, чтобы перебрать список:

 For Each item As File In QueueList
    'Console.WriteLine(item.FileID amp; vbTab amp; item.FileName)
Next item
  

Комментарии:

1. Отключив опцию Strict в VB 10, вы можете просто использовать Object и использовать динамические функции, добавленные в .Net 4.

Ответ №2:

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

 public class QueueFile
    public Property FileID as integer
    public property FileName as string
end class
  

 Private QueueList As New List(Of QueueFile)
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
    Dim QueueObj As New QueueFile
    QueueObj.FileID = "Test 1"
    QueueObj.FileName = "Test 2"
    QueueList.Add(QueueObj)
End Sub
  

Ответ №3:

Если у вас есть только два значения, вы можете найти использование универсального словаря даже лучше, чем ArrayList (требующий упаковки и распаковки типов) или List (из T), который сохраняет безопасность типов.

 Private QueueList As New Dictionary(of Integer, String)
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
   QueueList.Add(FileID, FileName)
End Sub
  

Если вам действительно нужна очередь, как указывает имя вашего метода, рассмотрите возможность использования общей очереди. Кроме того, если вам нужна только пара ключ / значение, вам не нужно создавать свой собственный класс. Вы можете использовать общую пару значений ключей (из T, S):

 Private QueueItems As New Queue(Of KeyValuePair(Of Integer, String))
Public Sub Queue(ByVal FileName As String, ByVal FileID As Integer)
   QueueItems.Enqueue(New KeyValuePair(Of Integer, String)(FileID, FileName))
End Sub
  

Чтобы извлечь элементы, используйте QueueItems .Удаление из очереди.