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

时间:2012-04-20 00:16:43

标签: 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; 
    } 
} 

enter image description here

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分: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());