使用LINQ查询一个字典,对比一个列表

6

我有

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

masterList包含键,这些键是selectedoptions值的超集。 现在,我想提取selectedOptionsmasterList之间交集的所有值。

如何构建LINQ查询?

1个回答

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是不必要的。

这并不符合我的目的。我需要从字典中获取匹配键的过滤值。但是它仍然返回匹配的键。我不确定在解释代码时是否做错了什么... - GilliVilla
@GilliVilla - results3 返回一个同时包含键和值的列表,问题具体在哪里? - Hogan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接