0

可能重复:
使用 LINQ 将列表拆分为子列表

我正在寻找某种方法来使用 LINQ 将可枚举拆分为三个可枚举,以便输入中的每个连续项目都位于序列中的下一个子列表中。所以输入

{"a", "b", "c", "d", "e", "f", "g", "h"}

会导致

{"a", "d", "g"}, {"b", "e", "h"}, {"c", "f"}

我已经这样做了,但我确信必须有一种方法可以使用 LINQ 更优雅地表达这一点。

var input = new List<string> {"a", "b", "c", "d", "e", "f", "g", "h"};
var list = new List<string>[3];

for (int i = 0; i < list.Length; i++)
    list[i] = new List<string>();

int column = 0;
foreach (string letter in input)
{
    list[column++].Add(letter);
    if (column > 2) column = 0;
}
4

1 回答 1

4

这就是您要查找的内容:(按列拆分)根据以前的帖子进行了修改

关键区别在于 group by,使用 mod 而不是 division。

我还把它变成了通用的,所以它会给你正确的类型(而不是“对象类型”代码)。您可以将类型推断与泛型一起使用。

public static IEnumerable<IEnumerable<T>> SplitColumn<T>( IEnumerable<T> source ) {
    return source
        .Select( ( x, i ) => new { Index = i, Value = x } )
        .GroupBy( x => x.Index % 3 )
        .Select( x => x.Select( v => v.Value ).ToList() )
        .ToList();
}
于 2012-07-26T13:36:02.620 回答