2015-05-09 2 views
1

У меня естьтиражирование массив и хранить его в другом массиве

string[] a = {"1","2","3","4","5"}; 

Я хочу, чтобы создать второй массив и есть его магазин * 3, что массив a имеет.

Так что второй массив будет выглядеть следующим образом:

string[] b = {"1","2","3","4","5","1","2","3","4","5","1","2","3","4","5"}; 

Я думал об использовании Array.Copy, но есть другой способ?

+1

Что не так с использованием 'Array.Copy'? Просто скопируйте массив в три сегмента нового массива. –

+0

Что ты пробовал и где ты застрял? Какую проблему вы достигли, чтобы начать думать, что вам следует исследовать другой способ сделать это? –

+0

В этом нет ничего плохого, но иногда есть разные способы решения одной и той же проблемы, поэтому я спрашивал, есть ли другой способ сделать это. Иногда в MSDN есть функция, которую кто-то знает, что делает именно то, что вы пытаетесь сделать, не реализуя ничего другого, поэтому я подумал, что кто-то может знать метод, который реплицирует массив в другой без какой-либо внешней логики или кода. – Kelbe

ответ

0

Ниже образец работает хуже, чем использование Array.Copy - это более просто играть с пути достижения того, что вы спрашиваете. Окончательный результат получаются с очень простым выглядящим вызовом string[] newArray = a.ArrayRepeat(3);

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ArrayRepeat 
{ 
    public static class ArrayHelper 
    { 
     public static IEnumerable<T> Repeater<T>(this T[] a, int reps) 
     { 
      for (int i = 0; i < reps; i++) 
      { 
       foreach (var item in a) 
       { 
        yield return item; 
       } 
      } 
     } 

     public static T[] ArrayRepeat<T>(this T[] a, int reps) 
     { 
      return a.Repeater<T>(reps).ToArray(); 
     } 
    } 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      string[] a = { "1", "2", "3", "4", "5" }; 
      string[] newArray = a.ArrayRepeat(3); 

      var pressKeyToExit = Console.ReadKey(); 
     } 
    } 
} 
+0

Это мой любимый! Хорошее мышление DW !!! – Kelbe

6

Вот весело LINQ заявление, которое получает ваш желаемый результат:

b = Enumerable.Range(0, 3).SelectMany(p => a).ToArray(); 
+1

Правильно, но грязно. Иногда лучше писать еще несколько строк кода, но лучше читать. –

+1

Это немного труднее читать, особенно для тех, кто не знаком с методами расширения LINQ, но это было бы достойным решением для репликации массива * n * количество раз (т. Е. Если значение «3» не фиксировано). Я бы, наверное, обернул его в удобную функцию, чтобы сделать ее цель более понятной. :) –

+0

@PawelMaga Да. Соглашусь. Однако был вопрос: «Есть ли другой способ?». Я просто даю пример. – cmcquillan

0

Вот другой подход, который не хаком, кажется чистым, и, возможно, даже полезно, хотя он по-прежнему не будет выполнять, а также Array.Copy:

using System; 
using System.Linq; 

namespace RepeatArray 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] a = { "1", "2", "3", "4", "5" }; 
      string[] newArray = Enumerable.Repeat(a, 3).SelectMany(x => x).ToArray(); 

      var pressKeyToExit = Console.ReadKey(); 
     } 
    } 
} 

Я должен предоставить реквизит @cmcquillan. Я пытался выяснить, как обойти его причудливость SelectMany(p => x), который просто отбрасывает p. Однако идея исходит от него.