我有以下格式的数据列表。我需要将输出作为输出,但不能完成。
输入:
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,但无法找到解决方案,因为我们在运行时生成了列名。
提前感谢。
答案 0 :(得分:2)
通过使用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);
}