从var转换为字典<String,int>

fot*_*otg 8 c# linq type-conversion

我有一个字典定义为 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'类型,因为它不是委托类型

我该如何进行转换?

Chr*_*air 16

这是因为你扔掉Value了电话Select(r => r.Key).KeyValuePair如果要将其转换回字典,则需要将它们保持在一起.

var temp = one.OrderBy(r => r.Value).Take(5);

var backToDictionary = temp.ToDictionary(r => r.Key, r => r.Value);
Run Code Online (Sandbox Code Playgroud)

如果你仍然希望拥有IEnumerable<string>问题中的密钥,可以单独使用:

var tempKeys = temp.Select(r => r.Key); 
Run Code Online (Sandbox Code Playgroud)

您收到一个看似无关的错误消息的原因IEqualityComparer是因为编译器试图最好地猜测您尝试调用哪个重载.在这种情况下它最好的猜测认为你试图调用这个过载.

考虑一下您拥有的代码及其生成的类型:

IEnumerable<string> temp = one.OrderBy(r => r.Value).Select(r => r.Key).Take(5);
Run Code Online (Sandbox Code Playgroud)

这将产生一个实现的对象IEnumerable<string>.然后你的电话:

temp.ToDictionary(r => r.Key, r => r.Value);
Run Code Online (Sandbox Code Playgroud)

r在这种情况下 string.此时的编译器是吓坏了,因为没有这样的东西r.Key,也没有r.Value.它识别出有两个参数被使用,因此有两个可能的重载可供选择ToDictionary(这个方法,这个).在这一点上,我不确定编译器选择其中一个的规则是什么(特别是因为它不能推断r.Keyor 的类型r.Value),但是它选择了其中之一.(也许它只是声明/发现的"第一个"?也许它有利于直接对象输入而不是lambda表达式?)无论如何,它选择需要IEqualityComparer而不是a 的重载Func<TSource, TElement>并且(自然地)告诉你lambda表达式不可转换至IEqualityComprarer.

根据我的经验,一旦你喂编译器垃圾(r.Keyr.Value在这种情况下),重载还挺就走出了窗外.有时它会运行,通常只有一个重载与数字参数匹配,或者至少没有歧义.但有时你只需要看看编译器错误并解决根问题.