C#列表数据到透视列表

时间:2015-07-06 11:34:14

标签: c# linq

我有以下格式的数据列表。我需要将输出作为输出,但不能完成。

输入:

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

提前感谢。

1 个答案:

答案 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);
}