我在VB.NET中有一个哈希表,我需要从它的值中获取一个键的字符串值。例如,如果我这样做:
hashtable.add("string1","string2")
如果我有“string2”,我如何获得值“string1”?
答案 0 :(得分:2)
你不能(至少不能简单地循环遍历每个值)。考虑多个键可以映射到相同值的事实:
hashtable.Add("string1", "string2")
hashtable.Add("string3", "string2")
现在给出“string2”你希望返回什么?
如果你真的需要进行“反向”查找,那么最简单的解决方案是可能有两个哈希表,一个用于“前向”查找,一个用于“反向”查找。 / p>
答案 1 :(得分:0)
Dean / codeka说你不能严格执行此操作。
但是你可以这样做,因为Hashtable的Keys
和Values
是相同的(未指定的)顺序:
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