[英]converting from var to dictionary<String,int>
我有一个字典定义为Dictionary<string, int> one
它有一些数据,我在上面做LINQ
var temp = one.OrderBy(r => r.Value).Select(r => r.Key).Take(5);
但现在我想将它转换回`Dictionary
我尝试使用temp.ToDictionary(r => r.Key, r => r.Value);
但它告诉我:无法将lambda表达式转换为'System.Collections.Generic.IEqualityComparer'类型,因为它不是委托类型
我该如何进行转换?
这是因为你通过调用Select(r => r.Key)
扔掉了Value
。 如果要将KeyValuePair
转换回字典,则需要将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
和r.Value
这样的东西。 它识别出有两个参数被使用,因此有两个可能的重载来从ToDictionary
( 这个方法 , 这个 )。 此时,我不确定编译器选择其中一个的规则是什么(特别是因为它无法推断r.Key
或r.Value
的类型),但它选择了其中一个。 (也许它只是声明/找到的“第一个”?也许它有利于直接对象输入而不是lambda表达式?)无论如何,它选择需要IEqualityComparer
而不是Func<TSource, TElement>
的重载并告诉你(自然) lambda表达式不能转换为IEqualityComprarer
。
根据我的经验,一旦你输入编译器垃圾(在这种情况下为r.Key
和r.Value
),重载r.Value
有点会消失。 有时它会运行,通常只有一个重载与数字参数匹配,或者至少没有歧义。 但有时你只需要看看编译器错误并解决根问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.