在数组中针对每一百个元素执行某些操作

3

我有一个包含100万个元素的数组,需要将这些元素分成每组100个,并执行一个函数,然后继续处理下一百个元素。

foreach (string value in lines)
{
    filescreated++;
    if (filescreated == ?????????)
    {
        do stuff 
    }
}

????等于可被100整除的值


3
给这个人一个机会吧,如果他知道答案就不会问了。有一些代码说明他已经尝试过了,但是无法找出测试条件。对我来说已经足够了。请记住,在SO上允许初学者提问。 - NullUserException
我正在绞尽脑汁地想着如何使用Linq来实现这个。有人能想到答案吗? - Andrew Shepherd
好的,我在这里找到了答案:https://dev59.com/a3A75IYBdhLWcg3wBkO1 - Andrew Shepherd
@Andrew:如果有一百万个元素,那么它的性能会非常糟糕...请查看他们解决方案的注释。 - Reed Copsey
@Reed Copsey - 如果我们不使用急切求值会怎样呢?我已经发布了一个答案,它使用LINQ但是采用了延迟求值。 - Andrew Shepherd
显示剩余3条评论
4个回答

9
等于值可被100整除。
foreach (...)
{
    filescreated++;

    if (filescreated % 100 == 0) 
    {
        // do stuff for the every 100th element
    }

    // do other stuff for every element
}

参考: 模数 (%) 运算符

如果您需要针对每个第100个元素执行特殊操作,但仍需要处理每个元素,请使用此功能。

如果您只需要处理每100个元素,请参考Reed的回答。


0

如果您需要按顺序并且百分比对您不好,那么怎么办?

这个问题很困惑,因为您谈论每一百个元素,然后又谈论100个一组。所以这里只能猜测。

        string[] lines = new string[1000000];
        for (int i = 0; i < 10000; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                DoSomething(lines[100*i + j], i);
            }
        }

0
我需要将这些元素分成100组,执行一个函数,然后继续处理下一百个。
如果这是一个数组,你可以直接使用for循环并每次增加100来实现此目的:
int chunkSize = 100;

for (int start=0; start<lines.Length;start += chunkSize)
{        
    ProcessSectionOfArray(lines, start, Math.Min(start+chunkSize-1, lines.Length-1));
}

我认为OP想要处理每个元素,但对于每100个元素做一些特殊的事情。 - NullUserException
@NullUserException:不是很清楚 - 我发了这个帖子,以防万一,因为这比不必要地循环遍历其他99个元素要好得多... - Reed Copsey

0
这里有一个解决方案,它将分区逻辑分离到一个单独的函数中。
    // A separate static function
    private static IEnumerable<IEnumerable<T>> BreakIntoBlocks<T>(T[] source, int blockSize)
    {
        for (int i = 0; i < source.Length; i += blockSize)
        {
            yield return source.Skip(i).Take(blockSize);
        }
    }


    // And in your code

    string[] lines = new string[1000000];
    foreach(IEnumerable<string> stringBlock in BreakIntoBlocks(lines, 100))
    {
            // stringblock is a block of 100 elements
            // Here is where you put the code that processes each separate group
    }

上述尝试应该比我的第一次尝试(如下)更快

        int blockSize = 100;
        int i = 0;
        IEnumerable<IEnumerable<string>> query = from s in lines
                                                let num = i++
                                                group s by num / blockSize into g
                                                select g;
        foreach(IEnumerable<string> stringBlock in query)
        {
            // Stringblock will be a block of 100 elements.
            // Process this 100 elements here.
        }

使用分组子句的问题在于LINQ会在返回第一个元素之前将这1000000个元素全部分配到组中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接