ToDictionary()LINQ擴展方法
ToList() 使用IEnumerable<T>並將其轉換為 List<T>,那麽 ToDictionary()也是類似的。大多數情況ToDictionary()是一個非常方便的方法,將查詢的結果(或任何 IEnumerable<T>)轉換成一個Dictionary<TKey,TValue>。 關鍵是您需要定義T如何分別轉換TKey和TValue。
如果說我們有超級大的產品列表,希望把它放在一個Dictionary<int, product>,這樣我們可以根據ID得到最快的查找時間。 你可能會這樣做:
var results = new Dictionary<int, Product>(); foreach (var product in products) { results.Add(product.Id, product); }
和它看起來像一個很好的代碼,但是我們可以輕松地使用LINQ而無需手寫一大堆邏輯:
var results = products.ToDictionary(product => product.Id);
它構造一個Dictionary<int, Product> ,Key是產品的Id屬性,Value是產品本身。 這是最簡單的形式ToDictionary(),你只需要指定一個key選擇器。 如果你想要不同的東西作為你的value? 例如如果你不在乎整個Product,,你只是希望能夠轉換ID到Name? 我們可以這樣做:
var results = products.ToDictionary(product => product.Id, product => product.Name);
這將創建一個 Key為Id,Value為Name 的Dictionary<int, string>,。由此來看這個擴展方法有很多的方式來處理IEnumerable<T> 集合或查詢結果來生成一個dictionary。
註:還有一個Lookup<TKey, TValue>類和ToLookup()擴展方法,可以以類似的方式做到這一點。 他們不是完全相同的解決方案(Dictionary和Lookup接口不同,他們的沒有找到索引時行為也是不同的)。
因此,在我們的Product 示例中,假設我們想創建一個Dictionary<string, List<Product>> ,Key是分類,Value是所有產品的列表。 在以前你可能自實現自己的循環:
1 // create your dictionary to hold results 2 var results = new Dictionary<string, List<Product>>(); 3 4 // iterate through products 5 foreach (var product in products) 6 { 7 List<Product> subList; 8 9 // if the category is not in there, create new list and add to dictionary 10 if (!results.TryGetValue(product.Category, out subList)) 11 { 12 subList = new List<Product>(); 13 results.Add(product.Category, subList); 14 } 15 16 // add the product to the new (or existing) sub-list 17 subList.Add(product); 18 }
但代碼應該更簡單! 任何新人看著這段代碼可能需要去詳細分析才能完全理解它,這給維護帶來了困難
幸運的是,對我們來說,我們可以利用LINQ擴展方法GroupBy()提前助力ToDictionary()和ToList():
// one line of code! var results = products.GroupBy(product => product.Category) .ToDictionary(group => group.Key, group => group.ToList());
GroupBy()是用Key和IEnumerable創建一個IGrouping的LINQ表達式查詢語句。 所以一旦我們使用GroupBy() ,所有我們要做的就是把這些groups轉換成dictionary,所以我們的key選擇器 (group => group.Key) 分組字段(Category),使它的成為dictionary的key和Value擇器((group => group.ToList()) 項目,並將它轉換成一個List<Product>作為我們dictionary的Value!
這樣更容易讀和寫,單元測試的代碼也更少了! 我知道很多人會說lamda表達式更難以閱讀,但他們是c#語言的一部分,高級開發人員也必須理解。我認為你會發現當你越來越多的使用他們後,代碼能被更好的理解和比以前更具可讀性。
ToDictionary()LINQ擴展方法