Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ如何使用元素索引转换列表列表_C#_Linq - Fatal编程技术网

C# 使用LINQ如何使用元素索引转换列表列表

C# 使用LINQ如何使用元素索引转换列表列表,c#,linq,C#,Linq,使用LINQ如何将列表列表转换为新列表,其中每个列表都具有来自同一索引的所有元素 比如说 l[0] = {3,15,22,6} l[1] = {9,81,52,7} l[2] = {2,0,32,73} 将变成 l[0] = {3,9,2} l[1] = {15,81,0} l[2] = {22,52,32} l[3] = {6,7,73} 谢谢您可以使用这个转置扩展方法,from(我将处理从Array.ForEach更改为ForEach,因为我发现它更清晰,谁不认为应该使用ForEach这

使用LINQ如何将列表列表转换为新列表,其中每个列表都具有来自同一索引的所有元素

比如说

l[0] = {3,15,22,6}
l[1] = {9,81,52,7}
l[2] = {2,0,32,73}
将变成

l[0] = {3,9,2}
l[1] = {15,81,0}
l[2] = {22,52,32}
l[3] = {6,7,73}

谢谢

您可以使用这个
转置
扩展方法,from(我将处理从
Array.ForEach
更改为
ForEach
,因为我发现它更清晰,谁不认为应该使用
ForEach
这样的方法):

公共静态IEnumerable转置(
这是(不可数的来源)
{
var enumerators=source.Select(e=>e.GetEnumerator()).ToArray();
尝试
{
while(枚举数.All(e=>e.MoveNext())
{
产生返回枚举数。选择(e=>e.Current.ToArray();
}
}
最后
{
foreach(枚举器中的变量枚举器)
枚举数。Dispose();
}
}
//例如。
IList l=新整数[3][];
l[0]=new[]{0,1,2,3};
l[1]=新[]{4,5,6,7};
l[2]=新[]{8,9,10,11};
l=l.Transpose().ToList();
//l是{0,4,8},{1,5,9},{2,6,10},{3,7,11}
var largestIndex=list.Max(x=>x.Count);
var listSize=list.Count;
var结果=可枚举范围(0,最大索引)
.Select(i=>Enumerable.Range(0,listSize)
.Where(x=>ilist[j][i]);

我假设输入列表的长度总是相同的?并且您的示例中的输出列表似乎有一个太多的元素(?)
public static IEnumerable<IList<T>> Transpose<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
    {
        foreach (var enumerator in enumerators)
            enumerator.Dispose();
    }
}

// e.g. 
IList<IList<int>> l = new int[3][];
l[0] = new []{0,1,2,3};
l[1] = new []{4,5,6,7};
l[2] = new []{8,9,10,11};
l = l.Transpose().ToList();
// l is { { 0, 4, 8 }, { 1, 5, 9 }, { 2, 6, 10 }, { 3, 7, 11 } }
source
    .SelectMany(list => list.Select((number, index) => Tuple.Create(number, index)))
    .GroupBy(e => e.Item2)
    .OrderBy(g => g.Key)
    .Select(g => g.Select(e => e.Item1).ToList())
    .ToList();
  var largestIndex=list.Max(x=>x.Count);
  var listSize=list.Count;
  var result=Enumerable.Range(0, largestIndex)
                       .Select(i => Enumerable.Range(0, listSize)
                           .Where(x => i < list[x].Count)
                           .Select(j => list[j][i]));