Как получить доступ к первому значению хеш-таблицы, не зная ключа? - PullRequest
0 голосов
/ 11 декабря 2018

После прочтения файла конфигурации во время установки я сохраняю веб-службы url в Hashtable для проверки возможности подключения к этим службам.

Прежде чем просмотреть все сохраненные значения, я хочу проверить только первое значение.Ключи, которыми я пользуюсь - это целый узел xml, содержащий сервис url, поэтому он мне неизвестен.

Сначала я не очень много знал о Hashtable, поэтому я попытался получить к нему доступ с помощью индекса,Предполагая, что ht является заполненным Hashtable, я попытался это сделать:

Dim serviceUrl as String = ht(0).Value

Что, очевидно, не удалось, поскольку нет key, равного 0, а serviceUrl это просто Nothing.

Затем я попытался получить доступ к первому элементу, используя:

Dim firstEntry as DictionaryEntry = ht(ht.Keys(0).ToString())
' Also tried this:
' Dim firstEntry as DictionaryEntry = ht(ht.Keys(0))

В обоих случаях я получил ошибку:

System.InvalidCastException: указанное приведение недопустимо.

В итоге я использовал For Each и вышел из цикла сразу после первой итерации.

For Each entry As DictionaryEntry In ht
    Dim serviceUrl as String = entry.Value
    'Use it and exit for.
    Exit For
Next

Что ж, это выглядит действительно ужасно.

После некоторого времени отладки и осмотра я использовал массив для хранения значений ключей:

Dim arr as Object() = new Object(100){}
'Copy the keys to that array.
ht.Keys.CopyTo(arr,0)

'Now I can directly access first item from the Hashtable:
Dim serviceUrl as String = ht(arr(0))

Я не уверен, что это правильный подход.

Есть ли прямой / чистый способ получить доступ к первому предмету из Hashtable?

1 Ответ

0 голосов
/ 11 декабря 2018

Свойство Keys является ICollection, а не IList, поэтому оно не может быть проиндексировано.ICollection - это просто IEnumerable со свойством Count, поэтому вы должны обращаться с ним так же, как с IEnumerable.Это означает перечисление, чтобы получить первый элемент.Вы можете использовать LINQ:

Dim firstKey = myHashtable.Keys.Cast(Of Object)().FirstOrDefault()

или перейти в старое учебное заведение:

Dim firstKey As Object

For Each key In myHashtable.Keys
    firstKey = key
    Exit For
Next

Если коллекция может быть пустой, вы можете сначала использовать свойство Count для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...