从var转换为dictionary
本文关键字:String int dictionary var 转换 | 更新日期: 2023-09-27 18:18:01
我有一个字典定义为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 '。因为它不是委托类型
我怎么做这个转换?
这是因为您在调用Select(r => r.Key)
时丢弃了Value
。如果您想将其转换回字典,则需要将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
这样的东西。它认识到有2个参数被使用,因此有两个可能的重载从ToDictionary
中选择(这个方法,和这个)。在这一点上,我不确定编译器选择其中一个而不是另一个的规则是什么(特别是因为它不能推断r.Key
或r.Value
的类型),但它选择了其中一个。(也许它只是声明/发现的"第一个"?也许它更喜欢直接对象输入而不是lambda表达式?)无论如何,它选择了需要IEqualityComparer
而不是Func<TSource, TElement>
的重载,并(自然地)告诉您lambda表达式不能转换为IEqualityComprarer
。
根据我的经验,一旦你给编译器提供了垃圾(在这个例子中是r.Key
和r.Value
),重载解析就会消失。有时是可行的,通常当只有一个重载与多个形参匹配时,或者至少没有歧义。但其他时候,你只需要看到编译器错误并解决根本问题。