如何从VB.NET中的值获取哈希表键名?

时间:2010-07-20 03:32:24

标签: vb.net hashtable

我在VB.NET中有一个哈希表,我需要从它的值中获取一个键的字符串值。例如,如果我这样做:

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

如果我有“string2”,我如何获得值“string1”?

2 个答案:

答案 0 :(得分:2)

你不能(至少不能简单地循环遍历每个值)。考虑多个键可以映射到相同值的事实:

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

现在给出“string2”你希望返回什么?

如果你真的需要进行“反向”查找,那么最简单的解决方案是可能有两个哈希表,一个用于“前向”查找,一个用于“反向”查找。 / p>

答案 1 :(得分:0)

Dean / codeka说你不能严格执行此操作。

但是你可以这样做,因为Hashtable的KeysValues是相同的(未指定的)顺序:

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