LINQ查询列表中的字典

时间:2012-08-24 17:42:23

标签: c# linq list dictionary linq-to-objects

我有

List<string> selectedOptions;
Dictionary<string,string> masterList;

masterList由Keys组成,它是selectedoptions中值的超集。 现在,我想提取selectedOptionsmasterList之间相交键的所有值。

如何构建LINQ查询?

1 个答案:

答案 0 :(得分:12)

IEnumerable<KeyValuePair<string,string>> results = 
    dic.Join(keys, d => d.Key, x => x, (a, b) => a);

或当然

var results2 = keys.Select(k => new {key = k, value = dic[k]});

但如果钥匙不存在,这将爆炸。

您可以使用Where(k => dic.ContainsKey(k))子句修复此问题:

var results3 = keys
     .Where(k => dic.ContainsKey(k))
     .Select(k => new {key = k, value = dic[k]});

在拖网Linq源之后,我认为最后一种方法可能效率最高。执行连接会强制linq在连接中涉及的其中一个集合上创建Lookup(实际上是多条目哈希表)。看到我们已经有一个提供与Lookup相同的查找性能的词典,构建Lookup是多余的。