2012-07-17 45 views
1

我在linq中有一個查詢,但我無法理解它,因爲我沒有寫這個查詢。查詢低於無法理解linq查詢

string[] arr1 = new string[] 
         { 
          "Pakistan:4,India:3,USA:2,Iran:1,UK:0", 
          "Pakistan:4,India:3,USA:2,Iran:1,UK:0", 
          "India:4,USA:3,Iran:2,UK:1,Pakistan:0" 
         }; 

     var count = arr1 
      .SelectMany(s => s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      .GroupBy(s => s.Split(':')[0], s => s.Split(':')[1]) 
      .ToDictionary(g => g.Key, 
       g => 
       { 
        var items = g.Distinct(); 
        var result = new Dictionary<String, int>(); 
        foreach (var item in items) 
         result[item] = g.Count(gitem => gitem == item); 
        return result; 
       }); 


     // print the result 
     foreach (var country in count.Keys) 
     { 
      foreach (var ocurrence in count[country].Keys) 
      { 
       Console.WriteLine("{0} : {1} = {2}", country, ocurrence, count[country][ocurrence]); 
      } 
     } 

目的本查詢

執行此查詢來實現這一點:我們想知道,巴基斯坦多少次帶有「0」,多少次與「1 ',2,3,4,我們希望爲所有國家獲取這些信息。請任何人都可以定義它步步.Thanks

注:此查詢被編譯,沒有錯誤且正常工作

+1

您是否嘗試閱讀每種方法的[documentation](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.aspx)? – 2012-07-17 04:43:42

+0

實際上,我問了一個關於堆棧溢出的問題,有人給了我這個答案,但我無法理解這一點。我閱讀文檔,但沒有得到任何幫助我的情況 – user1441945 2012-07-17 04:53:46

+0

你以前使用過Linq查詢嗎? – NoviceProgrammer 2012-07-17 04:56:15

回答

2

讓我們看看查詢,一步一步

SelectMany呈現分裂的結果「」並結合各種分裂回單的IEnumerable

項目每一個序列來元一個IEnumerable並將結果序列展平成一個序列。

所以在那個階段,您已轉換的陣列arr1成單個IEnumerable<string>與值等等USA:2

GroupBy然後基團IEnumberable<string>。它使用':'字符分割每個條目,如USA:2。左側是分組鍵,右側是值。

根據指定的鍵選擇器函數對序列的元素進行分組。

ToDictionary將該分組轉換爲字典。字典條目的關鍵是分組鍵(例如USA)。字典項的值是一個新的(匿名)對象:

g => 
      { 
       var items = g.Distinct(); 
       var result = new Dictionary<String, int>(); 
       foreach (var item in items) 
        result[item] = g.Count(gitem => gitem == item); 
       return result; 
      } 

匿名對象由經歷和計數給定數量的獨特事件(構建例如,如果關鍵是USA,多少次值1)並返回該計數。

0
var count = arr1 
     .SelectMany(s => s.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 

上述方法試圖通過拆分項目,所以它會提取每個項目來逐個像巴基斯坦未來的過程:4,印度:3

 .GroupBy(s => s.Split(':')[0], s => s.Split(':')[1]) 

這GROUPBY與所述計像巴基斯坦,4和巴基斯坦,0在一組,而印度,3和印度,4其他連接所有同一國家團隊喜歡其他人。

 .ToDictionary(g => g.Key, 

現在它正在考慮通過一個由像一個關鍵首先它需要巴基斯坦,印度,伊朗等

   g => 
      { 
       var items = g.Distinct(); 

該項目使得其計數輸入到ItemCollection像巴基斯坦包含在4,0可用於下一個計算。

    var result = new Dictionary<String, int>(); 
       foreach (var item in items) 
        result[item] = g.Count(gitem => gitem == item); 

一個獲取項目之一,也是保存在結果變量,g.count現在檢查多少條目,例如巴基斯坦相同的計數是有4兩次,0單的時候,同樣喜歡印度有3次2次4次。

    return result; 
      }); 

其餘的是獲取代碼並顯示在控制檯上。