2014-12-19 39 views
0

我正在尋找一個數據結構,允許我也搜索鍵和值。現在,我正在使用一個簡單的字典,但如果我在其中搜索值,我必須循環所有的鍵(如果我是正確的話,使用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

是你的獨特價值嗎? – helb 2014-12-19 10:15:45

+0

@helb是的,他們是 – HimBromBeere 2014-12-19 10:17:11

+0

我不確定你是否正確地使用它。你爲什麼要檢查這個值來返回一個鍵? – 2014-12-19 10:17:22

回答

0

考慮一個枚舉(如果您的列表始終是相同的):

enum MyDic 
{ 
    First = 1, 
    Second, 
    Third, 
    Fourth, 
    Fifth 
} 

這使得易都「的重點得到價值」和「關鍵得值」:

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 
} 

但是檢索t他值比從討論中,我們瞭解到,你的價值是獨一無二的太簡單的一個(記得KISS原則)

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"} 
} 

如果字典數據在運行時更改時,應該編寫一個方法來同步這兩個字典。

這種方法簡單,快速和多功能,但數據更改時會有開銷。

+0

我已經想到了這個解決方案,但是開銷有點煩人。 – HimBromBeere 2014-12-19 12:21:10

+0

這裏有一個很好的解決方案:http://stackoverflow.com/questions/10966331/two-way-bidirectional-dictionary-in-c – helb 2014-12-19 12:37:09