2009-08-21 9 views
0

Supposons que nous créons un System.Array commeComment se produit l'itération foreach pour System.Array à deux dimensions?


 Array _twoD = Array.CreateInstance(typeof(string), 2,2); 


     _twoD.SetValue("Harrish", 0, 0); 
     _twoD.SetValue("Goel", 0, 1); 
     _twoD.SetValue("Prakash", 1, 0); 
     _twoD.SetValue("Manish", 1, 1); 
     foreach (string str in _twoD) 
     { 
      Console.WriteLine(str); 
     } 

Comment le recenseur automatiquement itère [0,0] [0,1], [1,0], [1,1 ]?

[Pour un tableau simple simensionnel, il est facile de comprendre ce qui se passe en interne en 2D et 3D? Pouvons-nous créer un tableau de style irrégulier en utilisant System.Array?

Répondre

6

De msdn

Le type System.Array (Section 12.1.1) est un type de collection, et puisque tous les tableaux types dérivent de System.Array, toute expression de type tableau est autorisée dans une instruction foreach. L'ordre dans lequel foreach parcourt les éléments d'un tableau est la suivante: Pour matrices unidimensionnelles, des éléments sont traversés dans l'augmentation de l'indice ordre, en commençant avec l'indice 0 et se terminant avec l'indice Longueur - 1. Pour tableaux multidimensionnels, les éléments sont traversé de telle sorte que les indices de la dimension la plus à droite sont augmentés d'abord , puis la dimension gauche suivante, et ainsi de suite à gauche.

4

Oui, cela ira [0, 0], [0, 1] etc. Vous pouvez le voir plus facilement en créant un tableau 2D directement en C# avec new string[2,2].

En démonstration:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     string[,] strings = new string[2,2]; 
     // Just to make things absolutely explict 
     strings[0,0] = "0,0"; 
     strings[0,1] = "0,1"; 
     strings[1,0] = "1,0"; 
     strings[1,1] = "1,1"; 

     foreach (string x in strings) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 

Sortie:

0,0 
0,1 
1,0 
1,1 

Création d'un tableau en dents de scie avec System.Array est juste un cas de création d'un tableau avec un type d'élément de string[] etc. Un tableau en dents de scie est simplement un tableau de tableaux.

+0

Jon Skeet.Qu'il s'agisse d'un nom familier. Est-ce que vous créez C# en profondeur pour les effectifs? – user160677

+1

Ouais, c'est moi. –

2

Pour les tableaux qui énumèrent déchiquetés, SelectMany (LINQ) est votre ami:

int[][] data = { new int[] {0,1,2}, 
         new int[] {3,4}, 
         new int[] {5,6,7,8}}; 
    foreach (int i in data.SelectMany(row => row)) 
    { 
     Console.WriteLine(i); 
    } 

Ou dans la syntaxe de requête:

int[][] data = { new int[] {0,1,2}, 
         new int[] {3,4}, 
         new int[] {5,6,7,8}}; 
    foreach (int i in from row in data 
         from cell in row 
         select cell) 
    { 
     Console.WriteLine(i); 
    } 
1

Le réseau est énuméré rangée par rangée, puis colonne par colonne

 var array = new[,]{ 
      {"A1","A2","A3"}, 
      {"B1","B2","B3"} 
     }; 

     foreach (var item in array) 
     { 
      Console.WriteLine(item); 
     } 

Affiche:

A1

A2

A3

B1

B2

B3

En ce qui concerne votre deuxième question:

Peut-on créer une matrice de style Jagged en utilisant System.Array?

Pas directement. Un tableau en dents de scie est un tableau de tableaux, donc vous devrez écrire quelque chose comme ça:

 Array array = Array.CreateInstance(typeof(int[]), 2); 
     for (int i = 0; i < array.Length; i++) 
     { 
      array.SetValue(Array.Create(typeof(int) 3), i); 
     } 
Questions connexes