c#/linq数据分组

本文关键字:数据 linq | 更新日期: 2023-09-27 18:22:36

我有一个产品类,类似于:

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"。我想知道我该怎么办?

c#/linq数据分组

如果(名称、年份、供应商)的组合是唯一的,则使用此选项:

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);

类似这样的东西:

        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作为字典键,因为它们不是唯一的,因为它代表