2015-11-05 54 views
0

我有一個命名爲dict_id_names詞典:如果值在列表形式中,如何從字典中獲取鍵?

Dictionary<int,List<string>> dict_id_names = new Dictionary<int,List<string>(); 

假設字典有3鍵 - 值對:

  • id = 1:列表包含名 「羅賓」, 「拉胡」, 「亞當」, 「阿赫塔爾」,

  • id = 2:列表包含名 「太陽報」, 「星期一」, 「亞當」,

  • id = 3:列表中包含名稱「A」,「B」,「C」

現在我的問題是,如果我只有名字「亞當」那我怎麼才能得到相應的鍵/鍵爲1在上面的例子中有2個來自字典?

+1

是否需要將反向查找會是〜O(1)像正常字典?請注意,以下所有答案都涉及字典的全面掃描。 –

回答

5

你可以使用LINQ:

var keyValsWithAdamValue = dict_id_names.Where(kv => kv.Value.Contains("Adam")); 

foreach(var kv in keyValsWithAdamValue) 
    Console.WriteLine("{0}|{1}", kv.Key, String.Join(",", kv.Value)); 

如果你只是想在ID是你可以選擇它們,並使用ToList/ToArray創建集合:

List<int> idsWithAdamInList = dict_id_names 
    .Where(kv => kv.Value.Contains("Adam")) 
    .Select(kv => kv.Key) 
    .ToList(); 

注意,這種方法是像在字典上循環。如果您正在枚舉字典,則不會從字典的快速查找性能中受益。它不是爲此目的而設計的。但是如果性能在這種情況下並不那麼重要,那麼它就是簡單易讀的代碼並且非常完美。

1
string name = "Adam"; 
foreach(int key in dict_id_names.Keys) 
{ 
    List<string> valueList = dict_id_names[key]; 

    if(valueList.Contains(name); 
     Console.WriteLine(id); 
} 

這應該有所幫助。

+0

是的,我以前試過,但有沒有其他的方式或方法,沒有必要全面掃描字典? –

3

您可以使用下面的LINQ查詢:

int[] ids = dict_id_names 
        .Where(pair => pair.Value.Contains("Adam")) 
        .Select(pair => pair.Key) 
        .ToArray(); 

Console.WriteLine(String.Join(',', ids)); // 1,2 

這將導致陣列[1, 2],因爲這兩種詞典條目在它的字符串列表包含Adam

0

喜歡的東西 -

var dict_id_names= new Dictionary<int,List<string>>(); 
dict_id_names.Add(1, new List<string> { "Robin", "Rahul", "Adam", "Akhtar" }); 
var id = dict_id_names.Where(a => a.Value.Contains("Adam")).FirstOrDefault().Key; 
0

我只是想提供一個不同的角度,以進行比較。

假設您經常進行反向查找,並且希望它比O(N)操作更好。

你可以使用兩個字典而不是一個來實現。爲了簡化示例,我將使用微軟的預發佈版MultiValueDictionary(您可以通過NuGet獲取)。

這種方法產生的O(1)查找:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace Demo 
{ 
    internal class Program 
    { 
     public static void Main() 
     { 
      var names = new Names(); 

      names.Add(1, "Robin"); 
      names.Add(1, "Rahul"); 
      names.Add(1, "Adam"); 
      names.Add(1, "Akhtar"); 

      names.Add(2, "Sun"); 
      names.Add(2, "Mon"); 
      names.Add(2, "Adam"); 

      names.Add(3, "a"); 
      names.Add(3, "a"); 
      names.Add(3, "c"); 

      Console.WriteLine("IDs for Adam:"); 

      foreach (int id in names.IdsOf("Adam")) 
       Console.WriteLine(id); 
     } 

     public sealed class Names 
     { 
      readonly MultiValueDictionary<int, string> names = new MultiValueDictionary<int, string>(); 
      readonly MultiValueDictionary<string, int> lookup = new MultiValueDictionary<string, int>(); 

      public void Add(int id, string name) 
      { 
       names.Add(id, name); 
       lookup.Add(name, id); 
      } 

      public IEnumerable<int> IdsOf(string name) 
      { 
       IReadOnlyCollection<int> result; 

       if (lookup.TryGetValue(name, out result)) 
        return result; 
       else 
        return Enumerable.Empty<int>(); 
      } 

      public IEnumerable<string> NamesOf(int id) 
      { 
       IReadOnlyCollection<string> result; 

       if (names.TryGetValue(id, out result)) 
        return result; 
       else 
        return Enumerable.Empty<string>(); 
      } 
     } 
    } 
} 
相關問題