Linq to Objects - 从数字列表中返回数字对

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}.

Cra*_*ney 7

默认的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)


Mr.*_* TA 3

尝试这个:

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)

  • 你可以做 .Select((n, i)=&gt;...) 来获得自动计数器 (7认同)