ToDictionary()LINQ擴展方法

ToList() 使用IEnumerable<T>並將其轉換爲 List<T>,那麼 ToDictionary()也是相似的。大多數狀況ToDictionary()是一個很是方便的方法,將查詢的結果(或任何 IEnumerable<T>)轉換成一個Dictionary<TKey,TValue>。 關鍵是您須要定義T如何分別轉換TKey和TValue。c#

若是說咱們有超級大的產品列表,但願把它放在一個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? 咱們能夠這樣作:code

 var results = products.ToDictionary(product =>  product.Id, product =>  product.Name);

這將建立一個 Key爲Id,Value爲Name 的Dictionary<int, string>,。由此來看這個擴展方法有不少的方式來處理IEnumerable<T> 集合或查詢結果來生成一個dictionary。blog

 注:還有一個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():string

 // 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#語言的一部分,高級開發人員也必須理解。我認爲你會發現當你愈來愈多的使用他們後,代碼能被更好的理解和比之前更具可讀性。

相關文章
相關標籤/搜索