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,但无法找到解决方案,因为我们在运行时生成了列名。

提前感谢。

C#将数据列表到数据透视列表

通过使用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);
}