5

我一直在盯着我在另一个问题中找到的这段代码(下面逐字复制),我知道它并不多,但它让我无法理解 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; 
    } 
} 

在此处输入图像描述

4

2 回答 2

9

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

于 2012-04-20T00:21:52.187 回答
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());
于 2012-04-20T00:55:30.520 回答