[英]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.