【问题标题】:Do something for every hundredth element in an array为数组中的每一百个元素做一些事情
【发布时间】:2011-09-15 23:26:58
【问题描述】:

我在一个数组中有 100 万个元素,我需要将这些元素分成 100 个一组,执行一个函数并继续处理下一个 100 个

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

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

【问题讨论】:

  • Modulus 显然是您想要的解决方案。
  • 您是否需要将每个组都存储在某个地方以便以后访问它们?
  • @tke 让这家伙休息一下,如果他知道他不会问的话。有 some 代码的事实告诉我他尝试了,但无法提出测试条件。这对我来说已经足够了。请记住,允许在 SO 上提出初学者问题。
  • 我绞尽脑汁想着如何使用 Linq 做到这一点。谁能想到答案?
  • 好的,我在这里找到了答案:stackoverflow.com/questions/3514740/…

标签: c# arrays linq


【解决方案1】:

等于可被 100 整除的值

foreach (...)
{
    filescreated++;

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

    // do other stuff for every element
}

参考:modulus (%) operator

如果您需要对每 100 个元素执行一些特殊操作,但仍需要处理每个元素,请使用此选项。

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

【讨论】:

    【解决方案2】:

    这个怎么样(如果你需要按顺序和 % 对你不利)?

    当您谈论每 100 个元素时,这个问题令人困惑,然后是大约 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);
                }
            }
    

    【讨论】:

      【解决方案3】:

      我需要将这些元素分成 100 个一组,做一个函数并继续处理下一个 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:不清楚 - 我发布了这个以防万一,因为它比不必要地循环遍历其他 99 个元素要好得多......
      【解决方案4】:

      这是一种将分区逻辑分离为单独函数的解决方案。

          // 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 个元素中的每一个分配给组。

      【讨论】:

        猜你喜欢
        • 2015-10-20
        • 2018-06-18
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 2011-12-02
        • 2012-05-08
        相关资源
        最近更新 更多