这个拆分序列的linq代码如何工作?

Aar*_*ide 5 c# linq

我一直在盯着这个代码,我在另一个问题中找到了(下面逐字复制),我知道它并不多,但它让我逃避了i ++%部分的工作原理.

void Main()
{
    int[] a = new [] { 10, 3, 5, 22, 223 };

    a.Split(3).Dump();

}
static class LinqExtensions 
{ 
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts) 
    { 
        int i = 0; 
        var splits = from item in list 
                     group item by i++ % parts into part 
                     select part.AsEnumerable(); 
        return splits; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Kei*_*eau 9

它将项目分组为您指定的部件数量.i ++将为每个项目递增并应用模数运算符,以便将其放入正确数量的桶中.所以第一个项目在桶0中,第2个在桶1中,第3个在桶2中,第4个在桶0中等等...


jas*_*son 6

虽然Keith Rousseau是正确的,但我认为这个想法是实现这一目标的一种相当糟糕的方式.您可以通过以下方式更纯粹地实现它(即,无需改变捕获的变量):

var splits = list.Select((item, index) => new { Item = item, Index = index })
                 .GroupBy(pair => pair.Index % parts, element => element.Item)
                 .Select(group => group.AsEnumerable());
Run Code Online (Sandbox Code Playgroud)