在C#中通过值获取哈希表中的键

5
我想要获取我的值的键,但Hashtable不支持此操作。
是否有数据结构可以实现这一点?
    Hashtable x = new Hashtable();
    x.Add("1", "10");
    x.Add("2", "20");
    x.Add("3", "30");

    x.GetKey(20);//equal 2

你可以使用字典来实现这个功能。更多信息请参见:https://dev59.com/NXVC5IYBdhLWcg3wjx5d - Variant
1
这完全违背了Hashtable的设计初衷。你为什么要这么做呢?顺便提一下:自从.NET 2.0以来,你应该使用Dictionary<TKey, TValue>代替。 - Daniel Hilgarth
4个回答

9

如果您的所有键都是字符串。

var key = x.Keys.OfType<String>().FirstOrDefault(s => x[s] == "20")

或者最好使用字典:
Dictionary<string, string> x = new Dictionary<string, string>();
x.Add("1", "10");
x.Add("2", "20");
x.Add("3", "30");

string result = x.Keys.FirstOrDefault(s => x[s] == "20");

如果您知道您的值始终只有一个不同的键,请使用Single而不是FirstOrDefault


谢谢,字典更好。 - motaz99

3
如果您正在寻找O(1)解决方案,则可能需要实现反转的 Hashtable ,其中此表的值将成为键,而键则变为相应的值。

2

您可以使用Linq操作符

x.Keys.OfType<String>().FirstOrDefault(a => x[a] == "20")

您可以使用foreach进行迭代。

1

我强烈建议使用两个 Dictionary<string, string>,但这意味着它们之间存在一对一的关系:

var dict1 = new Dictionary<string, string>();
var dict2 = new Dictionary<string, string>();

dict1.Add("1", "10");
dict2.Add("10", "1");

dict1.Add("2", "20");
dict2.Add("20", "2");

dict1.Add("3", "30");
dict2.Add("30", "3");

var valueOfDictOne = dict1["1"];
var valueOfDictTwo = dict2["10"];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接