我正在搜索允许我搜索键和值的数据结构。现在我正在使用一个简单的字典,但如果我在其中搜索值,我必须循环所有键(如果我正确,则有O(n))。但由于我的地图很小(只有5个条目),我不确定这是否重要。
Dictionary<string, int> myDict = new Dictionary<string, int> {
{"first", 1},
{"second", 2},
{"third", 3},
{"fourth", 4},
{"fifth", 5}
}
现在按键访问地图很简单:
var myInt = myDict["second"]; // O(1)
但是因为我需要经常访问这个地图(对于键和值)我不确定是否有更好的方法来存储值,然后这个:
var myString = myDict.Single(x => x.Value == 2).Key; // O(n)
答案 0 :(得分:2)
通过讨论,我们了解到您的价值观也是独一无二的,因此您可以保留两张地图:
Dictionary<string, int> myDict = new Dictionary<string, int> {
{"first", 1},
{"second", 2},
{"third", 3},
{"fourth", 4},
{"fifth", 5}
}
Dictionary<int, string> myReverseDict = new Dictionary<int, string {
{1, "first"},
{2, "second"},
{3, "third"},
{4, "fourth"},
{5, "fifth"}
}
如果字典数据在运行时更改,则应编写一个方法来同步两个字典。
这种方法简单,快速且通用。但是当数据发生变化时会产生开销。
答案 1 :(得分:0)
考虑枚举(如果您的列表始终相同):
enum MyDic
{
First = 1,
Second,
Third,
Fourth,
Fifth
}
这样可以轻松获得按键获得的价值&#34;和&#34;按键获得价值&#34;:
var stringResult = (MyDic) 1; // returns First, use ToString() to get "First" as text.
var numResult = (int) MyDic.First; // returns 1
检查出来:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(((MyDic)1).ToString());
Console.WriteLine((int)MyDic.First);
Console.ReadKey();
}
}
注意:您可以使用enum
属性使Description
过于复杂,以便用不同的文字描述您的价值:
enum MyDic
{
[Description("Uno")]
First = 1,
Second,
Third,
Fourth,
Fifth
}
但是检索值的方式比简单方法更长(请记住 KISS 原则)