我有一个字典,我想根据密钥上的条件从字典中检索所有值列表,即我只想检索相应密钥在alist中匹配的值。
示例:字典如下
IDictionary<string, string> maskingValues = new Dictionary<string, string>();
maskingValues.Add("cat", "Me@ena");
maskingValues.Add("dog", "N&avya");
maskingValues.Add("llama", "vivek!a");
maskingValues.Add("iguana", "sh^ams");
我有字符串列表
List<string> keysString = new List<string>();
keysString.Add("cat");
keysString.Add("fox");
现在我的要求是从keysString列表中的键匹配的字典中获取值列表。
输出应为
Me@ena
直到现在我所做的是
var all_parameters = maskingValues .Keys.ToList();
var parameters_to_mask = all_parameters.Intersect(keysString);
var values_list = parameters_to_mask.Where(k => data_dictionary.ContainsKey(k)).Select(k => data_dictionary[k]);
所以values_list
将包含输出Me@ena
,我从字典中检索了所有键,然后将键列表与keysString
列表进行比较,然后从输出中检索值列表两个列表的相交。但我能否以更优化的方式进行,以便代码和性能良好。
提前致谢。请帮帮我。
答案 0 :(得分:4)
这应该有效:
var q = maskingValues.Where(x => keysString.Contains(x.Key)).Select(x => x.Value);
foreach (var item in q)
{
Console.WriteLine(item);
}
答案 1 :(得分:2)
有很多解决方案。例如:
var newlist = maskingValues.Where(x => keysString.Contains(x.Key)).Select(y=>y.Value).ToList();
答案 2 :(得分:1)
我想出了一些快速的代码来完全使用linq。
keysString.Where(x => maskingValues.Keys.Contains(x)).ToList().ForEach(x => Console.WriteLine(maskingValues[x]));
答案 3 :(得分:1)
不确定我的规格是否正确,但这比linq更快:
var matches = new List<string>();
foreach (var key in keysString)
{
if (maskingValues.TryGetValue(key, out string value))
{
matches.Add(value);
}
}
答案 4 :(得分:0)
如果你的字典很大,你可以利用字典中按键访问元素的事实来提高性能(
var result = keysString
.Select(k =>
{ string value;
maskingValues.TryGetValue(k, out value);
return value;
})
.Where(v => v != null);
...等......
请注意,使用TryGetValue
比调用Contains
然后使用字典索引器更有效。
答案 5 :(得分:-1)
这应该有效:
当您知道您的密钥名称并想要检索密钥值
时,将使用以下解决方案string objectValue;
maskingValues.TryGetValue("cat", out objectValue);
如果您想从“词典”中重新使用所有值而不是使用单行代码:maskingValues.Values