C#将数据列表到数据透视列表
本文关键字:列表 数据 透视 | 更新日期: 2023-09-27 18:01:08
我有以下格式的数据列表。我需要做支点作为输出,但没有完成。
输入:
Vehicle Service Value
GJ18-AU-8953 DIESEL FILTER SET 20555
GJ18-AU-8953 CROWN OIL 85W140 L/L 45445
GJ18-AU-8953 KAMANI BUSH 211212
GJ18-AU-8953 WHEEL SERVICE 4522
GJ18-AU-8953 ENGINE OIL 15W40 CI4+ 42121
GJ18-AU-8953 STEERING OIL 454584
GJ18-AU-8953 AIR FILTER SET 454545
GJ18-AU-8953 TAPID WATER 212
输出:
Vehicle DIESEL FILTER SET CROWN OIL 85W140 L/L KAMANI BUSH WHEEL SERVICE ENGINE OIL 15W40 CI4+ STEERING OIL AIR FILTER SET TAPID WATER
GJ18-AU-8953 20555 45445 211212 4522 42121 454584 454545 212
我参考了This,但无法找到解决方案,因为我们在运行时生成了列名。
提前感谢。
通过使用LINQ GroupBy
运算符,您既可以确定输出数据中的列,也可以确定如何创建行:
var columns = data.GroupBy(d => d.Service, (key, items) => key).ToList();
var groupedData = data.GroupBy(
d => d.Vehicle,
(key, items) => new {
Key = key,
Values = items.ToDictionary(item => item.Service, item => item.Value)
}
);
只有当每辆车最多有一个服务价值时,这才会起作用。如果车辆和服务的同一组合可以有多个值,则需要指定如何聚合这些值并相应地修改ToDictionary
。
您还没有指定您想要如何表示输出,所以这里有一种打印输出的方法,使其与您在问题中使用的格式相匹配(排序-列由制表符分隔(:
Console.WriteLine("Vehicle't" + String.Join("'t", columns));
foreach (var group in groupedData) {
Console.Write(group.Key);
foreach (var column in columns)
Console.Write("'t" + (group.Values.ContainsKey(column)
? group.Values[column].ToString() : String.Empty));
Console.WriteLine();
}
或者您可以从数据创建一个DataTable
:
var dataTable = new DataTable();
dataTable.Columns.Add("Vehicle", typeof(String));
foreach (var column in columns)
dataTable.Columns.Add(column, typeof(Int32));
foreach (var group in groupedData) {
var values = new[] { group.Key }
.Concat(
columns.Select(
column => group.Values.ContainsKey(column)
? (Object) group.Values[column] : DBNull.Value
)
)
.ToArray();
dataTable.Rows.Add(values);
}