【问题标题】:What's the best way to copy/fill a large array with a smaller array in C#?在 C# 中用较小的数组复制/填充大数组的最佳方法是什么?
【发布时间】:2025-12-26 18:40:10
【问题描述】:

我有一个大的 int[] 数组和一个小得多的 int[] 数组。我想用小数组中的值填充大数组,方法是将小数组重复复制到大数组中直到它填满(这样 large[0] = large[13] = large[26] ... =小[0]等)。我已经有了一个简单的方法:

int iSource = 0;
for (int i = 0; i < destArray.Length; i++)
{
    if (iSource >= sourceArray.Length)
    {
        iSource = 0; // reset if at end of source
    }
    destArray[i] = sourceArray[iSource++];
}

但我需要更优雅的东西,希望更快。

【问题讨论】:

    标签: c# arrays .net-2.0


    【解决方案1】:

    有趣的是,获胜的答案是提供的源数组中最慢的!

    我打算提出的解决方案是

    for (int i = 0; i < destArray.Length; i++)
    {
        destArray[i] = sourceArray[i%sourceArray.Length];
    }
    

    但是当我使用回答问题中的输入测试超过 100000 次迭代的性能时,它的性能比提问者循环差。

    这是我的小测试应用程序的输出

    数组复制 164 毫秒(Nelson LaQuet 的代码) 分配副本 77ms(MusiGenesis 代码) 分配 mod 副本 161ms(headsling 的代码)

    【讨论】:

    • 你是说我的原始代码是最快的吗? (我从未对这些中的任何一个进行基准测试)
    • 是的!分配副本(您的)在 100 万次迭代中得分为 77 毫秒。还不错吧?
    【解决方案2】:

    使用Array.Copy() 重载让您的循环工作,它允许您从一个数组复制到目标数组中的特定索引。

    if (sourceArray.Length == 0) return; // don't get caught in infinite loop
    
    int idx = 0;
    
    while ((idx + sourceArray.Length) < destArray.Length) {
        Array.Copy( sourceArray, 0, destArray, idx, sourceArray.Length);
    
        idx += sourceArray.Length;
    }
    
    Array.Copy( sourceArray, 0, destArray, idx, destArray.Length - idx);
    

    【讨论】:

      【解决方案3】:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      namespace Temp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
                  int[] array2 = new int[213];
      
                  for (int i = 0; i < array2.Length; i += array.Length)
                  {
                      int length = array.Length;
                      if ((i + array.Length) >= array2.Length)
                          length = array2.Length - i;
                      Array.Copy(array, 0, array2, i, length);
                  }
      
                  int count = 0;
                  foreach (int i in array2)
                  {
                      Console.Write(i.ToString() + " " + (count++).ToString() + "\n");
                  }
      
                  Console.Read();
              }
          }
      }
      

      :)

      编辑 发现如果它们不能被彼此分割就会崩溃的错误。现在修复:)

      【讨论】:

      • 除非我遗漏了什么,否则i % array.Length 永远不会是 0。