2013-01-14 2 views
0

У меня есть List<Fields> коллекцию, где Поля класса имеет следующие свойстваC# Aggregation на пользовательские объекты

(Name, Currency, Amount, Date, OtherList) где OtherList находится список

выборочные значения

Name Currency Amount Date   F1 F2 F3 
ABC XX  12  12 Jan 2013 X  Y  Z 
BCA YY  11  12 Jan 2013 A  B  C 
ABC XX  10  13 Jan 2013 X  Y  Z 

Теперь OtherList объект будет имеют значения (X, Y, Z) для record1 и (A, B, C) для record2 et.el

Что мне нужно сделать, это применить агрегацию в приведенном выше списке в полях Имя, Валюта, F1, F2 и F3, чтобы результат был следующим.

Выход

Name Currency Amount Date   F1 F2 F3 
ABC XX  22  13 Jan 2013 X  Y  Z 
BCA YY  11  12 Jan 2013 A  B  C 

Любая идея, как я могу это сделать?

Спасибо.

ответ

2

Вы можете использовать LINQ:

var aggrList = list 
    .GroupBy(x => new { x.Name, x.Currency, x.F1, x.F2, x.F3 }) 
    .Select(grp => new { 
      Name = grp.First().Name, 
      Currency = grp.First().Currency, 
      Amount = grp.Sum(x=>x.Amount), 
      Date = grp.Max(x=>x.Date), 
      F1 = grp.First().F1,  
      F2 = grp.First().F2,  
      F3 = grp.First().F3,  
     }); 
+0

Я сожалею, но otherList не список но Dictionary <строка, строка>. Мне нужно группироваться на основе значений в словаре. Кроме того, вышеупомянутое решение, похоже, не работает, потому что я могу использовать только x.Name, x.Currency и x.OtherList, а не x.F1, x.F2 в предложении GroupBy. – Jithu

+0

Причина в том, что x.OtherList является открытым объектом, а не x.F1 et el – Jithu

0

Попробуйте сгруппировать следующим образом:

list.Where(x => x.OtherList != null && x.OtherList.Count >= 3) 
    .GroupBy(x => new {F1 = x.OtherList[0], F2 = x.OtherList[1], F3 = x.OtherList[2]}) 
    .Select(g => new 
    { 
     Name = g.First().Name, 
     Currency = g.First().Currency, 
     Amount = g.Sum(x => x.Amount), 
     Date = g.Max(x => x.Date), 
     F1 = g.Key.F1, 
     F2 = g.Key.F2, 
     F3 = g.Key.F3, 
    }); 

Я думаю, для Date вы будете применять Max() функцию, на сумму - Sum(), но, как вы планируете применять агрегацию для Name и Currency полей?

Смежные вопросы