从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 '。因为它不是委托类型

我怎么做这个转换?

从var转换为dictionary<String,int>

这是因为您在调用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.Keyr.Value这样的东西。它认识到有2个参数被使用,因此有两个可能的重载从ToDictionary中选择(这个方法,和这个)。在这一点上,我不确定编译器选择其中一个而不是另一个的规则是什么(特别是因为它不能推断r.Keyr.Value的类型),但它选择了其中一个。(也许它只是声明/发现的"第一个"?也许它更喜欢直接对象输入而不是lambda表达式?)无论如何,它选择了需要IEqualityComparer而不是Func<TSource, TElement>的重载,并(自然地)告诉您lambda表达式不能转换为IEqualityComprarer

根据我的经验,一旦你给编译器提供了垃圾(在这个例子中是r.Keyr.Value),重载解析就会消失。有时是可行的,通常当只有一个重载与多个形参匹配时,或者至少没有歧义。但其他时候,你只需要看到编译器错误并解决根本问题。