如果值是List形式,如何从字典中获取键?

时间:2015-11-05 09:04:24

标签: c# dictionary

我有一个名为dict_id_names的词典:

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

假设字典包含3个键值对:

  • id = 1:列表包含名称“Robin”,“Rahul”,“Adam”,“Akhtar”,

  • id = 2:列表包含名称“Sun”,“Mon”,“Adam”,

  • id = 3:列表包含名称“a”,“b”,“c”

现在我的问题是,如果我只有名字“Adam”,那么我怎样才能从字典中获得上述案例中的1和2各自的键/键?

5 个答案:

答案 0 :(得分:4)

您可以使用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 :(得分:2)

您可以使用以下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

答案 2 :(得分:1)

self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Close", style: UIBarButtonItemStyle.Plain, target: self, action: "backTapped:")

这应该有所帮助。

答案 3 :(得分: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;

答案 4 :(得分:0)

为了比较的目的,我想提供一个不同的视角。

假设您经常进行反向查找,并且希望它比O(N)操作更好。

您可以使用两个词典而不是一个词典来实现。为简化此示例中的内容,我将使用Microsoft的预发布 LAContext *context = [[LAContext alloc] init]; [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@“prove yourself ?” reply:^(BOOL success, NSError *error) { if (error) { return; } if (success) { NSLog(@"you are the iPhone owner"); open the next screen } else { } }]; (您可以通过NuGet获取)。

这种方法产生O(1)查找:

MultiValueDictionary