Value
这是因为您在调用 to时丢弃了Select(r => r.Key)
. KeyValuePair
如果要将其转换回字典,则需要将其保留在一起。
var temp = one.OrderBy(r => r.Value).Take(5);
var backToDictionary = temp.ToDictionary(r => r.Key, r => r.Value);
如果您仍然希望拥有IEnumerable<string>
问题中的密钥,则可以单独使用:
var tempKeys = temp.Select(r => r.Key);
您收到看似无关的错误消息的IEqualityComparer
原因是编译器试图对您尝试调用的重载做出最佳猜测。在这种情况下,它的最佳猜测认为您试图调用此重载。
考虑您拥有的代码及其生成的类型:
IEnumerable<string> temp = one.OrderBy(r => r.Value).Select(r => r.Key).Take(5);
这将产生一个实现IEnumerable<string>
. 然后你的电话:
temp.ToDictionary(r => r.Key, r => r.Value);
r
在这种情况下是 string
。此时的编译器吓坏了,因为没有r.Key
nor之类的东西r.Value
。它识别出使用了 2 个参数,因此有两个可能的重载可供选择ToDictionary
(此方法和此方法)。在这一点上,我不确定编译器选择一个而不是另一个的规则是什么(特别是因为它无法推断r.Key
or的类型r.Value
),但它选择了其中一个。(也许它只是声明/找到的“第一个”?也许它更喜欢直接对象输入而不是 lambda 表达式?)无论如何,它选择需要 aIEqualityComparer
而不是 a的重载Func<TSource, TElement>
并(自然地)告诉您 lambda 表达式是不可转换的至IEqualityComprarer
.
以我的经验,一旦你给编译器提供垃圾(r.Key
在r.Value
这种情况下),重载决议就会消失。有时它会奏效,通常是当只有一个重载与数字参数匹配时,或者至少没有歧义。但其他时候你只需要查看编译器错误并修复根本问题。