【问题标题】:c#/linq data groupingc#/linq 数据分组
【发布时间】:2012-02-03 10:49:52
【问题描述】:

我有一个类似的产品类:

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 group-by


    【解决方案1】:

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

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

    【讨论】:

    • 应该是 List 而不是 Product。这似乎是一个列表,我得到了错误。
    • 这次我得到'已添加具有相同密钥的项目。'
    • @esun203:请查看更新。现在它可以正常工作,即使 (Name, Year, Vendor) 的组合不是唯一的。我对查询语法完全感到困惑,因为我从不使用它。
    【解决方案2】:

    类似这样的:

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

    【讨论】:

    • 在原始问题中的数据 Name/Vendor/Year 形成一个唯一的集合。您的 B 组有两个 95 的供应商。这在数据中可能是可能的,但它不在原始规范中......因此这似乎工作得很好。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2019-01-23
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多