簡體   English   中英

從var轉換為字典<String,int>

[英]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.Keyr.Value這樣的東西。 它識別出有兩個參數被使用,因此有兩個可能的重載來從ToDictionary這個方法這個 )。 此時,我不確定編譯器選擇其中一個的規則是什么(特別是因為它無法推斷r.Keyr.Value的類型),但它選擇了其中一個。 (也許它只是聲明/找到的“第一個”?也許它有利於直接對象輸入而不是lambda表達式?)無論如何,它選擇需要IEqualityComparer而不是Func<TSource, TElement>的重載並告訴你(自然) lambda表達式不能轉換為IEqualityComprarer

根據我的經驗,一旦你輸入編譯器垃圾(在這種情況下為r.Keyr.Value ),重載r.Value有點會消失。 有時它會運行,通常只有一個重載與數字參數匹配,或者至少沒有歧義。 但有時你只需要看看編譯器錯誤並解決根問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM