一尘不染

使用LINQ枢轴数据

c#

我有一个项目集合,其中包含一个Enum(TypeCode)和一个User对象,我需要将其展平以显示在网格中。很难解释,所以让我举一个简单的例子。

集合中包含以下项目:

TypeCode | User 
---------------
1        | Don Smith  
1        | Mike Jones  
1        | James Ray  
2        | Tom Rizzo  
2        | Alex Homes  
3        | Andy Bates

我需要的输出是:

1          | 2          | 3  
Don Smith  | Tom Rizzo  | Andy Bates  
Mike Jones | Alex Homes |  
James Ray  |            |

我尝试使用foreach进行此操作,但是我不能那样做,因为我会将新项目插入到foreach中的集合中,从而导致错误。

可以用更干净的方式在Linq中完成此操作吗?


阅读 203

收藏
2020-05-19

共1个答案

一尘不染

我并不是说这是一种 很好的 枢纽方式-但这是一种枢纽…

    // sample data
    var data = new[] {
        new { Foo = 1, Bar = "Don Smith"},
        new { Foo = 1, Bar = "Mike Jones"},
        new { Foo = 1, Bar = "James Ray"},
        new { Foo = 2, Bar = "Tom Rizzo"},
        new { Foo = 2, Bar = "Alex Homes"},
        new { Foo = 3, Bar = "Andy Bates"},
    };
    // group into columns, and select the rows per column
    var grps = from d in data
              group d by d.Foo
              into grp
              select new {
                  Foo = grp.Key,
                  Bars = grp.Select(d2 => d2.Bar).ToArray()
              };

    // find the total number of (data) rows
    int rows = grps.Max(grp => grp.Bars.Length);

    // output columns
    foreach (var grp in grps) {
        Console.Write(grp.Foo + "\t");
    }
    Console.WriteLine();
    // output data
    for (int i = 0; i < rows; i++) {
        foreach (var grp in grps) {
            Console.Write((i < grp.Bars.Length ? grp.Bars[i] : null) + "\t");
        }
        Console.WriteLine();
    }
2020-05-19