在 C# 中用较小的数组复制/填充大数组的最佳方法是啥?

Posted

技术标签:

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

我有一个大的 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++];

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

【问题讨论】:

【参考方案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。

以上是关于在 C# 中用较小的数组复制/填充大数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将大数组拆分为较小的数组?

C# 将一个数组分成多个较小的数组(随机)

在 JS 中用多个值填充数组的最快方法。我可以将一些模式或函数传递给 JS 中单个值的方法填充吗? [复制]

在数组中查找具有更大索引但数组中值较小的元素[重复]

用较小的球体最佳地填充3D球体

如何在简洁的单行初始化语句中用 n 个不同的空数组填充新数组? [复制]