#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 .Удаление из очереди.