我有一个名为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各自的键/键?
答案 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