在地图中搜索键和值

时间:2014-12-19 10:11:20

标签: c# dictionary

我正在搜索允许我搜索键和值的数据结构。现在我正在使用一个简单的字典,但如果我在其中搜索值,我必须循环所有键(如果我正确,则有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)

2 个答案:

答案 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 原则)