2013-04-19 4 views
1

Я ищу способ ввода 4 одномерных массивов в многомерный массив 4x4.Вставить одномерный массив в многомерный массив

В то время, которое я потратил на поиск этого, я обнаружил, что гораздо проще использовать зубчатые массивы. Тем не менее, я чувствую, что упускаю что-то очевидное и хотел бы попросить о помощи.

for (int x = 0; x <= 3; x++) 
{ 
    //reads in 4 separate values e.g. A B C D 
    unitReader = sr.ReadLine(); 

    //creates a char array with 4 separate elements 
    char[] line = unitReader.ToCharArray(); 

    //places that array into a bigger jagged array 
    fullArray[x] = line; 

    //just to test that it's worked 
    Console.WriteLine(fullArray[x]); 
} 

это, как я был в состоянии сделать это с зубчатым массивом, который определен ранее как:

char[][] fullArray = new char[4][]; 

Есть ли код похож на это, что позволило бы мне назначить значения по линии к многомерному массиву без необходимости выполнять 16 проходов для назначения отдельных элементов?

+0

Почему вам не нравится 16 назначений? – shibormot

+0

@shibormot - Может быть, проблема с масштабируемостью? Возможно, его массив может быть 16 x 16 или 32 x 32 когда-нибудь? – Tim

+0

@bootski проверить эту статью: http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx массивы иногда требуются только для проблем с производительностью – shibormot

ответ

0

Я думаю, что вы ищете Buffer.BlockCopy()

Для получения более подробной информации см Documentation of BufferCopy.BlockCopy

+0

ах, очень приятно. я собираюсь изучить это, и я вернусь и помету вас как ответ, если это так. выглядит многообещающим. – bootski

+0

Это единственный способ, который я могу найти, который позволяет то, что я спросил простым (иш) способом. однако, из-за сложности этого решения и масштабирования, я решил придерживаться зубчатых массивов. спасибо minhcat_vo. – bootski

0

для масштабируемости, вы можете попробовать собственные коллекции как этот

public class FixedSizeCollection<T> : Collection<T> 
{ 
    protected bool _initializing; 
    public int Size { get; private set; } 

    public FixedSizeCollection(int size) 
    { 
     Size = size; 
     Init(); 
    } 

    public FixedSizeCollection(int size, IList<T> list) 
    { 
     Size = size; 
     Init(); 
     if (list.Count != Size) 
      throw new InvalidOperationException("Changing size is not supported."); 

     foreach (T item in list) 
      Items[list.IndexOf(item)] = item; 
    } 

    protected virtual void Init() 
    { 
     _initializing = true; 
     base.ClearItems(); 
     for (int j = 0; j < Size; j++) 
      Add(default(T)); 
     _initializing = false; 
    } 

    protected override void ClearItems() 
    { 
     Init(); 
    } 

    protected override void InsertItem(int index, T item) 
    { 
     if (!_initializing) 
      throw new InvalidOperationException("Changing size is not supported."); 
     base.InsertItem(index, item); 
    } 

    protected override void RemoveItem(int index) 
    { 
     if (!_initializing) 
      throw new InvalidOperationException("Changing size is not supported."); 
     base.RemoveItem(index); 
    } 

    protected override void SetItem(int index, T item) 
    { 
     base.SetItem(index, item); 
    } 
} 

public class SquareArray<T> : FixedSizeCollection<FixedSizeCollection<T>> 
{ 
    public SquareArray(int size) : base(size) 
    { 
    } 

    protected override void Init() 
    { 
     _initializing = true; 
     for (int i = 0; i< Size; i++) 
     { 
      FixedSizeCollection<T> row = new FixedSizeCollection<T>(Size); 
      Add(row); 
     } 
     _initializing = false; 
    } 

    protected override void SetItem(int index, FixedSizeCollection<T> item) 
    { 
     if (item.Count != Size) 
      throw new InvalidOperationException("Changing size is not supported."); 
     base.SetItem(index, item); 
    } 
} 

, то ваш цикл будет выглядеть так:

SquareArray<char> fullarray = new SquareArray(4); 

for (int x = 0; x <= 3; x++) 
{ 
    //reads in 4 separate values e.g. A B C D 
    unitReader = sr.ReadLine(); 

    //creates a char array with 4 separate elements 
    char[] line = unitReader.ToCharArray(); 

    //places that array into a bigger jagged array 
    fullArray[x] = new FixedSizeCollection(4, line); 

    //just to test that it's worked 
    Console.WriteLine(fullArray[x]); 
} 
+0

спасибо. в то время как это, вероятно, относится к масштабируемости, оно не затрагивает вопрос о многомерном массиве. Кроме того, это немного сложнее для меня, поскольку я довольно новичок в этом (как вы, вероятно, можете сказать). – bootski

Смежные вопросы