在 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# 中用较小的数组复制/填充大数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章