c# Datatable -使用linq对多个列进行分组

本文关键字:Datatable 使用 linq | 更新日期: 2023-09-27 18:12:47

我有一个这样的Datatable

| Supplier  | Product | Price1 | Price2 | Price3 | ... | PriceN |
|-----------|---------|--------|--------|--------|-----|--------|
| Supplier1 | Orange  | 100    | 105    | 150    | ... | 180    |
| Supplier1 | Orange  | 110    | 130    | 140    | ... | 180    |
| Supplier2 | Orange  | 200    | 250    | 270    | ... | 350    |
| Supplier2 | Orange  | 250    | 270    | 320    | ... | 270    |

我想将行分组为下一行:

| Supplier  | Product | Price1  | Price2  | Price3  | ... | PriceN  |
|-----------|---------|---------|---------|---------|-----|---------|
| Supplier1 | Orange  | 100-110 | 105-130 | 140-150 | ... | 180     |
| Supplier2 | Orange  | 200-250 | 250-270 | 270-320 | ... | 270-350 |

像"PriceN"这样的列的计数可以是任意的。我如何用LINQ做到这一点?

c# Datatable -使用linq对多个列进行分组

您可以将SupplierProduct分组为

var result = from x in data
             group x by new { x.Supplier, x.Product }
             select x;

var result = data.GroupBy(x => new { x.Supplier, x.Product });

同样,你可以在group子句

中使用任意数量的属性。

你必须在另一个lambda表达式中单独分组

result.tolist().GroupBy(p=> p.x,p.x2,p.x3 ...);

您可以使用GroupByJOIN来连接价格列的值:

var groupedSupplier = supplier.GroupBy(s => new { s.Supplier, s.Product })
                              .Select(supplier => supplier.Supplier, 
                                                  supplier.Product,
                                                  supplier.Price1 = string.Join(",", supplier.Select(x => x.Price1)),
                                                  supplier.Price2 = string.Join(",", supplier.Select(x => x.Price2)),
...);

在lambda表达式中按多列分组使用:

var groupedSupplier = supplier.GroupBy(s => s.Supplier,
                                       s => s.Product)

详细信息,请参见Jon Skeet的"c#深度"第11章,第11章"查询表达式和LINQ到对象:11.6分组和延续",http://csharpindepth.com/