2013-04-19 5 views
1

Je cherche un moyen d'entrer 4 tableaux unidimensionnels dans un tableau multidimensionnel 4x4.Insérer un tableau dimensionnel dans un tableau multidimensionnel

Au cours de mes recherches, j'ai trouvé que cela semblait beaucoup plus simple avec les tableaux dentelés. Cependant, j'ai l'impression de manquer quelque chose et je voudrais demander de l'aide.

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]); 
} 

Voilà comment je suis en mesure de le faire avec le tableau en dents de scie qui est défini précédemment comme:

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

Y at-il un code similaire à ce qui me permettrait d'attribuer des valeurs par ligne à un tableau multidimensionnel sans avoir à faire 16 passes pour assigner des éléments individuels?

+0

pourquoi n'aimez-vous pas 16 assignés? – shibormot

+0

@shibormot - Problème d'évolutivité peut-être? Peut-être que son tableau pourrait être 16 x 16 ou 32 x 32 un jour? – Tim

+0

@bootski vérifier cet article: http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-considered-somewhat-harmful.aspx tableaux sont parfois nécessaires uniquement pour les problèmes de performance – shibormot

Répondre

0

Je pense que vous êtes à la recherche Buffer.BlockCopy()

Pour plus de détails, voir Documentation of BufferCopy.BlockCopy

+0

ah, très bien. Je vais regarder dans ceci et je reviendrai et vous marquerai comme réponse si elle est. Cela semble prometteur. – bootski

+0

c'est la seule façon que je peux trouver qui permet de ce que j'ai demandé d'une manière simple (ish). Cependant, en raison de la complexité de cette solution et de la mise à l'échelle, j'ai décidé de m'en tenir aux tableaux dentelés. merci minhcat_vo. – bootski

0

pour l'évolutivité, vous pouvez essayer des collections personnalisées comme ce

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); 
    } 
} 

alors votre la boucle ressemblera à ceci:

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

merci. Bien que cela traite probablement de l'évolutivité, il n'aborde pas la question du tableau multidimensionnel. aussi, c'est un peu trop compliqué pour moi car je suis assez nouveau à ce sujet (comme vous pouvez probablement le dire). – bootski

Questions connexes