2015-09-22 2 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 

Как я могу получить этот результат, не слишком много Еогеасп?

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' для' А д Т *? Точно так же рассчитывается для других с данными, которые вы предоставили? –

+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() 
               });