如何从c#列表中的键匹配的字典中获取值列表

时间:2017-03-20 10:04:54

标签: c# list dictionary

我有一个字典,我想根据密钥上的条件从字典中检索所有值列表,即我只想检索相应密钥在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列表进行比较,然后从输出中检索值列表两个列表的相交。但我能否以更优化的方式进行,以便代码和性能良好。

提前致谢。请帮帮我。

6 个答案:

答案 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