2015-09-22 42 views
-2

我有這樣的代碼片段:LINQ GroupBy - 如何分組?

List<string[]> list = new List<string[]>(); 
list.Add(new string[] { "A", "q", "t" }); 
list.Add(new string[] { "B", "w", "t" }); 
list.Add(new string[] { "B", "e", "r" }); 
list.Add(new string[] { "A", "r", "t" }); 
list.Add(new string[] { "B", "t", "e" }); 

var result = from item in list 
    group item by item[0] into g 
    let count = g.Count() 
    orderby count descending 
    select new { Value = g.Key, Count = count}; 

foreach (var res in result) 
{ 
    Console.WriteLine("Value: " + res.Value + " Count: " + res.Count); 
} 

該產品這樣的結果:

Value: B Count: 3 
Value: A Count: 2 

我怎樣才能得到這樣的結果,沒有太多的foreach?

Values: A q t - Count 2 
Values: A r t - Count 2 
Values: B w t - Count 3 
Values: B e r - Count 3 
Values: B t e - Count 3 
+0

你怎麼有計數'2'爲'A Q t'?同樣用你提供的數據計算其他人的數值? –

+1

計數2是因爲字母「A」在數據的第一列中出現兩次。字母「B」出現三次。 –

回答

1

您可以通過每個數組的第一個項目做以下

var result = list.GroupBy(innerArray => innerArray[0]) 
    .SelectMany(
     grp => grp.Select(innerArray => new 
      { 
       Values = innerArray, 
       Count = grp.Count() 
      })); 

foreach(var r in results) 
{ 
    Console.WriteLine("Values: {0} - Count {1}", string.Join(" ", r.Values), r.Count); 
} 

這第一組,那麼使用SelectMany每組壓扁放回原陣列和包括計數。

由此產生的確切順序爲您的要求,這可能是你的數據的巧合。如果你想確保它按照計數升序排列,你可以在那裏拋出一個OrderBy(g=>g.Count())

1

訣竅是FTO使用SelectMany

var result = list.GroupBy(x=> x[0]) 
         .SelectMany(x=> x, 
            (x,xx)=> new { 
                Value=string.Join(" ",xx), 
                Count = x.Count() 
               });