2010-03-14 98 views
254

可能重複:
Getting key of value of a generic Dictionary?值獲取辭典鍵

我如何通過值在C#中的字典鍵?

Dictionary<string, string> types = new Dictionary<string, string>() 
{ 
      {"1", "one"}, 
      {"2", "two"}, 
      {"3", "three"} 
}; 

我想是這樣的:

getByValueKey(string value); 

getByValueKey("one")必須返回"1"

這樣做的最佳方法是什麼?也許HashTable,SortedLists?

+7

精確重複:http://stackoverflow.com/questions/255341/ – Gabe 2010-03-14 22:29:03

+0

我以前閱讀過這篇文章,但回答到達那裏。 – loviji 2010-03-14 22:38:27

+3

是的,但是你得到了[Skeet公認的答案](http://stackoverflow.com/a/255638/1028230)。 – ruffin 2014-01-20 22:33:42

回答

441

值不一定必須是唯一的,因此您必須執行查找。你可以做這樣的事情:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key; 

如果值是唯一的,並且頻率低於讀取插入,然後建立逆字典,其中值鍵和鍵的值。

+0

我的價值不公佈。所以你的想法對我有好處。謝謝。 – loviji 2010-03-14 22:37:37

+2

@loviji:請記住,在循環解決方案中,如果值恰好位於字典的末尾,則必須檢查所有其他值才能找到它。如果您有多個條目,這會降低您的程序速度。 – 2010-03-14 22:41:17

+2

@Zach Johnson:謝謝。我贊同你。你的回答我也很喜歡。但在我的字典8-10條目。而不是動態添加的。我認爲,使用這個答案不是壞的解決方案。 – loviji 2010-03-14 22:45:34

21

你可以這樣做:

  1. 通過遍歷所有KeyValuePair<TKey, TValue>的字典中(這將是一個相當大的性能命中,如果你有在字典中的條目數)循環
  2. 使用兩字典,一個用於值到鍵的映射,另一個用於鍵值映射(這將佔用內存空間的兩倍)。

如果性能不是考慮因素,請使用方法1,如果不考慮內存,請使用方法2。

此外,所有密鑰必須是唯一的,但值不必是唯一的。您可能有多個具有指定值的鍵。

是否有任何理由不能扭轉鍵值關係?

+0

爲了以編程方式創建逆字典,我們仍然需要使用方法1,對吧? – 2017-12-17 21:38:35

8

如果該值存在多於一個密鑰會怎麼樣?

應該退還哪個密鑰?

爲避免做出假設,微軟並未包含GetKey方法。

-8

我有非常簡單的方法來做到這一點。它對我來說非常完美。

Dictionary<string, string> types = new Dictionary<string, string>(); 

types.Add("1", "one"); 
types.Add("2", "two"); 
types.Add("3", "three"); 

Console.WriteLine("Please type a key to show its value: "); 
string rLine = Console.ReadLine(); 

if(types.ContainsKey(rLine)) 
{ 
    string value_For_Key = types[rLine]; 
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key); 
} 
+2

對不起,但你的答案不符合這個問題。問題是關於如何通過值找到關鍵字,您的答案顯示標準:通過鍵找到值 – Breeze 2015-07-23 08:58:30

+1

首先閱讀questiion,下一次 – Tommix 2015-08-04 11:36:34

+2

而這,女士們先生們,正是我們在發佈答案之前閱讀問題的原因。 – Krythic 2017-11-12 03:40:08

-2
types.Values.ToList().IndexOf("one"); 

Values.ToList()你的字典中的值轉換爲對象的名單。 IndexOf(「one」)將搜索您的新列表以查找「one」,並返回與字典中的鍵/值對的索引匹配的索引。

此方法不關心字典鍵,它只是返回您正在查找的值的索引。

請記住,字典中可能存在多個「one」值。這就是沒有「獲取鑰匙」方法的原因。

-2

下面的代碼只有當它包含唯一的數值數據工作

public string getKey(string Value) 
{ 
    if (dictionary.ContainsValue(Value)) 
    { 
     var ListValueData=new List<string>(); 
     var ListKeyData = new List<string>(); 

     var Values = dictionary.Values; 
     var Keys = dictionary.Keys; 

     foreach (var item in Values) 
     { 
      ListValueData.Add(item); 
     } 

     var ValueIndex = ListValueData.IndexOf(Value); 
     foreach (var item in Keys) 
     { 
      ListKeyData.Add(item); 
     } 

     return ListKeyData[ValueIndex]; 

    } 
    return string.Empty; 
} 
+1

-1代碼太多,會比[來自Kimi的最佳答案](https://stackoverflow.com/a/2444064/146513)(這是在你之前6年發佈的)最差。您不必爲了創建這兩個列表而對foreach鍵和值屬性進行foreach(Linq的ToList將爲您執行此操作)。此外,如果您打算使用IndexOf,則可以避免對ContainsValue的調用(從而避免通過同一任務的所有元素進行2次循環)。 – 2017-08-31 14:12:18

+1

這個建議的表現很糟糕。你也可以用兩個字典創建一個泛型類。其中一個保存Key1和Key2,另一個保存Key2和Key1。通過這種方式,您可以在沒有...好的情況下得到任何一個鍵......您的答案建議的一切。 – Krythic 2017-11-12 03:37:04

-1

也許是這樣的:

foreach (var keyvaluepair in dict) 
{ 
    if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject)) 
    { 
     //dict.Remove(keyvaluepair.Key); 
     break; 
    } 
} 
1

我在LINQ的結合是不可及的情況必須明確擴大拉姆達。這導致了一個簡單的函數:

public static string KeyByValue(Dictionary<string, string> dict, string val) 
{ 
    string key = null; 
    foreach (KeyValuePair<string, string> pair in dict) 
    { 
     if (pair.Value == val) 
     { 
      key = pair.Key; 
      break; 
     } 
    } 
    return key; 
} 

調用它如下:

public static void Main() 
{ 
    Dictionary<string, string> dict = new Dictionary<string, string>() 
    { 
     {"1", "one"}, 
     {"2", "two"}, 
     {"3", "three"} 
    }; 

    string key = KeyByValue(dict, "two");  
    Console.WriteLine("Key: " + key); 
} 

作品在.NET 2.0和其他有限的環境。