Как я могу получить имя ключа хеш-таблицы из значения в VB.NET? - PullRequest
2 голосов
/ 20 июля 2010

У меня есть хеш-таблица в VB.NET, и мне нужно получить строковое значение ключа из его значения. Например, если я делаю:

hashtable.add("string1","string2")

Как бы я получил значение "string1", если бы у меня было "string2"?

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Вы не можете (по крайней мере, без простого циклического перебора всех значений). Учтите, что несколько ключей могут отображаться на одно и то же значение:

hashtable.Add("string1", "string2")
hashtable.Add("string3", "string2")

Теперь, учитывая "string2", что вы ожидаете получить?

Если вам действительно необходимо выполнить «обратный» поиск, то простейшим решением, вероятно, будет иметь две хеш-таблицы, одну для «прямого» поиска и одну для «обратного» поиска. *

0 голосов
/ 20 июля 2010

Как говорит Дин / кодека, вы не можете делать это строго.

Однако вы можете сделать что-то подобное, так как Keys и Values Hashtable находятся в том же (неуказанном) порядке:

Hashtable ht = new Hashtable();
ht.Add("string1", "str2");
ht.Add("string2", "str2");

List<string> keys = new List<string>(ht.Keys.OfType<string>());

string key = ht.Values.OfType<string>()
  .Select((htI, i) => new { Key = keys[i], Value = htI })
  .Where(htKVP => htKVP.Value == "str2")
  .Select(htKVP => htKVP.Key)
  .FirstOrDefault();

Однако было бы лучше использовать Dictionary<string, string> только потому, что он типизирован и позволяет легче добраться до Linq.

Конвертирован для VB.NET, то есть:

Dim ht as new Hashtable()
ht.Add("string1", "str2")
ht.Add("string2", "str2")

Dim keys as new List(Of String)(ht.Keys.OfType(Of String)())

Dim key as String = ht.Values.OfType(Of String)() _
  .Select(Function(htI, i) New With { .Key = keys(i), .Value = htI }) _
  .Where(Function(htKVP) htKVP.Value = "str2") _
  .Select(Function(htKVP) htKVP.Key) _
  .FirstOrDefault()

Но снова я бы начал с:

Dim dt as New Dictionary(Of String, String)

Вы можете добавить это как метод расширения, например:

Imports System.Runtime.CompilerServices

Module StringExtensions

    <Extension()> 
    Public Function FirstKeyForValue(ByVal Hashtable as ht, ByVal value As String) As String
      return ht.Values.OfType(Of String)() _
      .Select(Function(htI, i) New With { .Key = keys(i), .Value = htI }) _
      .Where(Function(htKVP) htKVP.Value = "str2") _
      .Select(Function(htKVP) htKVP.Key) _
      .FirstOrDefault()        
    End Function

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