使用 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}
谢谢
您可以从dtb 的回答中使用此Transpose
扩展方法(我将处理从更改为,因为我发现它更清晰,而且我不是唯一一个不认为应该使用这样的方法的人):Array.ForEach
foreach
ForEach
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]));