我正在寻找一种方法,使用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;
}
答案 0 :(得分:4)
这就是你要找的东西: (按列拆分)根据之前的帖子修改
关键区别在于,使用mod代替除法。
此外,我将它设为通用,因此它会返回正确的类型(而不是“对象类型”代码)。您可以使用泛型类型推断。
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();
}