使用共同的键合并两个字典

6

我正在尝试基于共同的查找值将两个字典集合合并在一起。

var idList = new Dictionary<int, int>();
idList.Add(1, 1);
idList.Add(3, 3);
idList.Add(5, 5);

var lookupList = new Dictionary<int, int>();
lookupList.Add(1, 1000);
lookupList.Add(2, 1001);
lookupList.Add(3, 1002);
lookupList.Add(4, 1003);
lookupList.Add(5, 1004);
lookupList.Add(6, 1005);
lookupList.Add(7, 1006);

// Something like this:
var q = from id in idList.Keys
        join entry in lookupList on entry.Key equals id
        select entry.Value;

上面的Linq语句仅为示例,不能编译。对于idList中的每个条目,根据匹配的键从lookupList中提取值。
结果应该是来自lookupList的值列表(1000、1002、1004)。
使用Linq最简单的方法是什么?

当某些东西无法编译时,最好包含编译器告诉你的信息。 - Amy B
抱歉,我觉得我离正确答案还有很大的差距。 - rboarman
4个回答

16
from id in idList.Keys
where lookupList.ContainsKey(id)
let value1 = idList[id]
let value2 = lookupList[id]
select new {id, value1, value2}
或者更经典的方式
from kvp1 in idList
join kvp2 in lookupList on kvp1.Key equals kvp2.Key
select new {key = kvp1.Key, value1 = kvp1.Value, value2 = kvp2.Value}
您查询中的错误是作用域之一:
from a in theAs
join b in theBs on (leftside) equals (rightside)

在左侧区域,a的作用域是有效的。在右侧区域,b的作用域是有效的。


谢谢大家!非常快的响应时间。 :) - rboarman

1

如果我误解了您的问题,我很抱歉,但是您是否只想从列表B中检索与列表A具有相同Key的KeyValuePair的值?

from lookup in lookupList
where idList.Keys.Contains(lookup.Key)
select lookup.Value;

我会给你点赞,但请继续接受 David B 的答案。他公正地比我更详细地解答了问题。 :) - Nathan Taylor
在语句末尾添加.AsQueryable()是安全的吗?这样做会有性能问题吗?查找集合非常大。 - rboarman
@rboarman:答案按得分排序,而不是时间。请查看右下角的“回答于……前”以查看答案给出的时间。 - Pavel Minaev
在某种意义上,添加 .AsQueryable() 是安全的,因为如果您尝试枚举它,最终会得到相同的结果。性能问题取决于您实际上计划如何使用它(您肯定有想要这样做的原因,对吧?)。 - Pavel Minaev
你需要使用AsQueryable()方法的目的是什么? - Nathan Taylor

0
        var q = from id in idList
                join entry in lookupList
                  on id.Key equals entry.Key
                select entry.Value;

你想要的linq语句看起来应该像这样,ID和Entry需要在条件中交换位置。

0
你觉得这个怎么样?
var values = idList.Keys.Select(i => lookupList[i]);

啊,我明白了。你有不匹配的东西。我应该将它更改为Keys.Contains。无论如何,Nathan的答案是正确的方法。 - Marcote

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