#vb.net #.net-1.1
#vb.net #.net-1.1
Вопрос:
Я использую VB .NET 1.1 и хотел убедиться, существует ли внутри класса пары ключ-значение «Даты» (тип коллекции) ключ с именем «TerminationDate».
If Not Dates.Item("TerminationDate") Is Nothing Then
'Do x y z'
End if
Но это вызывает исключение:
Индекс аргумента не является допустимым значением.
Я очень новичок в VB.
Спасибо
Ответ №1:
Как вы видели, Contains
метод был добавлен в платформе 2.0, поэтому вы не можете его использовать. Насколько я могу судить, в рамках 1.1 нет способа проверить существование данного ключа. Единственный способ сделать это — попытаться получить элемент по этому ключу и проглотить исключение, если оно не найдено. Этот вспомогательный метод сделает это:
Private Shared Function CollectionHasKey(col As Microsoft.VisualBasic.Collection, key As String) As Boolean
Try
Dim O = col.Item(key)
Return True
Catch ex As Exception
Return False
End Try
End Function
Чтобы использовать его:
Dim MyCol As New Microsoft.VisualBasic.Collection()
MyCol.Add(New Date(), "D")
Trace.WriteLine(CollectionHasKey(MyCol, "D"))
Trace.WriteLine(CollectionHasKey(MyCol, "Q"))
Комментарии:
1. -1: Использование блоков try catch в качестве реальной логики является очень плохой практикой, и ее следует избегать любой ценой.
2. @Брэдли Уффнер, это правда, но если другого способа нет, то это лучший способ.
3. 1: Возможно, это не лучшая практика, но использование .NET 1.1 также не является лучшей практикой 😉
4. Существует множество других способов, например, циклический просмотр коллекции.
5. Вы пробовали это? Циклический просмотр коллекции, даже в последних версиях framework, возвращает сами объекты, а не ключи. Нет способа перечислить сами ключи.
Ответ №2:
Элемент использует значение индекса для возврата элемента. Его позиция в коллекции начинается с 0. Если вы хотите найти его с помощью ключа: «TerminationDate», вам следует использовать вместо этого Contains. Нравится:
If Dates.Contains("TerminationDate") Then
'Do stuff
End If
Отредактировано на основе комментариев:
Прошу прощения, я подумал, что, поскольку вы упомянули пары ключ / значение, которые вы связываете, вы использовали определенный тип коллекции. словарь. Если у вас есть коллекция пар KeyValuePairs, вам придется перебирать каждый элемент, чтобы увидеть, присутствует ли нужный вам элемент. Нравится:
Dim Item as keyValuePair = nothing
For i as integer = 0 to Dates.Count -1
if Dates.Item(i).Key = "TerminationDate" Then
Item = Dates.Item(i)
End if
Next
If Not Item Is Nothing Then
'Do stuff
End If
Мои имена типов 1.1 могут быть отключены для KeyValuePair, и я думаю, что Count напрямую отключен от Collection, но это может быть метод, отключенный от Items (если Items является свойством). У меня не установлена платформа 1.1 для проверки.
Contains является членом dictionary даже в версии 1.1 и позволит вам найти элемент по ключу без цикла. вот дополнительная информация об этом типе, если это то, что вас интересует:
http://msdn.microsoft.com/en-us/library/system.collections.dictionarybase (v= VS.71).aspx
Комментарии:
1. Я пробовал thar перед публикацией этого вопроса, но я получил эту ошибку компиляции: Contains не является членом Microsoft.VisualBasic. Коллекция. Опять же, это VB.NET 1.1… Спасибо…
2. Можете ли вы показать мне, как вы объявили коллекцию и добавили в нее элементы? Я немного запутался в том, какую вещь вы на самом деле используете из-за вашего использования пары collection amp; key value. Если это коллекция, вам, вероятно, потребуется пройти весь цикл, чтобы найти точное соответствие. Я могу дать вам лучшие предложения с этой информацией. Спасибо
3. Используется операционная система,
Microsoft.VisualBasic.Collection
которая на самом деле ведет себя не так, как обычно. К сожалению, нет коллекций.4. Хорошо, тогда мой тип (KeyValuePair) может быть неправильным, но общая концепция цикла все равно должна работать.
5. Вы могли бы подумать, что это так, но это не так. К сожалению, циклический просмотр коллекции возвращает только сам объект, а не какую-либо ключевую информацию.