Cri*_*scu 12 c# linq linq-to-objects aggregate slice
var nums = new[]{ 1, 2, 3, 4, 5, 6, 7};
var pairs = /* some linq magic here*/ ;
Run Code Online (Sandbox Code Playgroud)
=> pairs = {{1,2},{3,4},{5,6},{7,0}}
元素pairs应该是两元素列表,或者是一些具有两个字段的匿名类的实例,例如new {First = 1, Second = 2}.
默认的linq方法都不能通过单次扫描来懒散地执行此操作.用自己压缩序列会进行2次扫描,并且分组并不完全是懒惰的.您最好的选择是直接实施它:
public static IEnumerable<T[]> Partition<T>(this IEnumerable<T> sequence, int partitionSize) {
Contract.Requires(sequence != null)
Contract.Requires(partitionSize > 0)
var buffer = new T[partitionSize];
var n = 0;
foreach (var item in sequence) {
buffer[n] = item;
n += 1;
if (n == partitionSize) {
yield return buffer;
buffer = new T[partitionSize];
n = 0;
}
}
//partial leftovers
if (n > 0) yield return buffer;
}
Run Code Online (Sandbox Code Playgroud)
尝试这个:
int i = 0;
var pairs =
nums
.Select(n=>{Index = i++, Number=n})
.GroupBy(n=>n.Index/2)
.Select(g=>{First:g.First().Number, Second:g.Last().Number});
Run Code Online (Sandbox Code Playgroud)