旋转 - 使用LINQ C#转置列表<List <string >>

B.B*_*dan 4 c# linq transpose pivot-table

我有一个List<List<string>>,它是从远程数据源(即WCF)返回的.因此,我需要使用LINQ将以下数据修改为用户友好的列表

C#代码是

List<List<string>> PersonInfo = new List<List<string>>()
{
    new List<string>() {"John", "Peter", "Watson"},
    new List<string>() {"1000", "1001", "1002"}
}
Run Code Online (Sandbox Code Playgroud)

适当的屏幕截图:现有的

在此输入图像描述

我需要旋转数据,如下面的屏幕截图:建议

在此输入图像描述

请帮助我如何使用LINQ C#旋转数据

Oli*_*ver 14

这是一个简单而灵活的解决方案,它将处理具有任意数量维度的多个内部列表.

List<List<string>> PersonInfo = new List<List<string>>()
{
    new List<string>() {"John", "Peter", "Watson"},
    new List<string>() {"1000", "1001", "1002"}
};


var result = PersonInfo
    .SelectMany(inner => inner.Select((item, index) => new { item, index }))
    .GroupBy(i => i.index, i => i.item)
    .Select(g => g.ToList())
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @pmackni 这完全有可能。我想说这是值得一个单独的问题 - 如何将锯齿状数组转换为矩形数组,用特定值填充间隙。 (3认同)

fub*_*ubo 9

这是一个通用的扩展方法

public static IEnumerable<IEnumerable<T>> Pivot<T>(this IEnumerable<IEnumerable<T>> source)
{
    var enumerators = source.Select(e => e.GetEnumerator()).ToArray();
    try
    {
        while (enumerators.All(e => e.MoveNext()))
        {
            yield return enumerators.Select(e => e.Current).ToArray();
        }
    }
    finally
    {
        Array.ForEach(enumerators, e => e.Dispose());
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以

var result = PersonInfo.Pivot();
Run Code Online (Sandbox Code Playgroud)