поиск элемента по типу коллекции в VB .NET 1.1

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