Каков наилучший способ скопировать / заполнить большой массив меньшим массивом в C #? - PullRequest
3 голосов
/ 10 октября 2008

У меня большой массив 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++];
}

Но мне нужно что-то более элегантное и, надеюсь, быстрее.

Ответы [ 3 ]

2 голосов
/ 10 октября 2008
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();
        }
    }
}

:)

EDIT Обнаружена ошибка, при которой, если бы они не были разделены друг на друга, это могло привести к сбою. Исправлено:)

2 голосов
/ 17 января 2009

Интересно, что победивший ответ самый медленный с предоставленным исходным массивом!

Решение, которое я собирался предложить, было

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

, но когда я тестировал перфект более 100000 итераций, используя входные данные в ответе на вопрос, это работало хуже, чем цикл опроса

вот вывод из моего маленького тестового приложения

array copy 164ms      (Nelson LaQuet's code) 
assign copy 77ms      (MusiGenesis code)
assign mod copy 161ms (headsling's code)
2 голосов
/ 10 октября 2008

Ваш цикл работает с использованием перегрузки 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);
...