2012-02-03 2 views
2

У меня есть класс продукт что-то вроде:гр данные #/LINQ группировки

class Product 
{ 
    public string Name; 
    public int Year; 
    public int Vendor; 
    public int Count; 
} 

Ввод данных как

Name Year Vendor Count 

'A' 1990 1  15 

'A' 1990 2  20 

'A' 1998 4  5 

'B' 1995 1  15 

'B' 1995 2  2 

Я хочу, чтобы преобразовать данные в новую структуру, как

class NewStructure 
{ 
public string Name; 
public int Year; 
Dictionary<int, int> Vendor_Count; 
} 

Поле Dictionary используется для хранения пары {Vendor, Count}, пара Name и Year будет иметь словарь корректуры. Результат будет

Name Year Vendor Count 

'A' 1990 1 15 

      2 20 

'A' 1998 4 5 

'B' 1995 1 15 

      2 2 

Я попытался следующий Linq запрос

from input in inputList 
group inputList by new { input.Name, input.Year } 
into grouping 
orderby grouping.Key.Name, grouping.Key.Year 
select new 
{ 
    ProductName = grouping.Key.Name, 
    OriginYear = grouping.Key.Year, 
    Vendor_Count = grouping. 
} 

Но я не могу получить право 'Vendor_Count'. Интересно, что мне делать?

ответ

1

Что-то вроде этого:

 var p1 = new Product(){Count=15, Name="A", Vendor = 1, Year = 1990}; 
     var p2 = new Product() { Count = 20, Name = "A", Vendor = 2, Year = 1990 }; 
     var p3 = new Product() { Count = 5, Name = "A", Vendor = 4, Year = 1998 }; 
     var p4 = new Product() { Count = 15, Name = "B", Vendor = 1, Year = 1995 }; 
     var p5 = new Product() { Count = 2, Name = "B", Vendor = 1, Year = 1995 }; 

     var inputList = new[] {p1, p2, p3, p4, p5}; 

     var newStructure = inputList 
      .GroupBy(p => new { p.Name, p.Year }) 
      .Select(g => new { g.Key.Name, g.Key.Year, VendorCount = g.ToDictionary(p => p.Vendor, p => p.Count) } 
     ); 

Хотя я не думаю, что вы можете использовать Vendor в качестве словарного ключа, потому что они не уникальны, поскольку он стоит

+0

В данных в исходном вопросе Name/Vendor/Year образуют уникальный набор. В вашем наборе B есть два Vendor для 95. Это может быть возможно в данных, но это не в оригинальной спецификации ... Таким образом, это, кажется, работает отлично. :) – Chris

+0

Да, это работает. Спасибо Aidan – esun203

2

Используйте это, если комбинация (название, год, Vendor) является уникальным:

inputList.GroupBy(x => new { x.Name, x.Year }) 
     .Select(x => new 
         { 
          ProductName = x.Key.Name, 
          OriginYear = x.Key.Year, 
          Vendor_Count = x.ToDictionary(y => y.Vendor 
                 y => y.Count) 
         }) 
     .OrderBy(x => x.ProductName).ThenBy(x => x.OriginYear); 

Используйте это, если он не является уникальным:

inputList.GroupBy(x => new { x.Name, x.Year }) 
     .Select(x => new 
         { 
          ProductName = x.Key.Name, 
          OriginYear = x.Key.Year, 
          Vendor_Count = x.GroupBy(y => y.Vendor) 
              .ToDictionary(y => y.Key, 
                 y => y.Sum(z => z.Count)) 
         }) 
     .OrderBy(x => x.ProductName).ThenBy(x => x.OriginYear); 
+0

будет x List , а не Продукт. Кажется, это список, и я получил ошибку. – esun203

+0

@ esun203: Правильно. Исправлена. –

+0

На этот раз я получил «Элемент с тем же ключом уже добавлен». – esun203