Como você percorre um array multidimensional?

foreach (String s in arrayOfMessages) { System.Console.WriteLine(s); } 

string[,] arrayOfMessages está sendo passado como um parâmetro.

Eu quero ser capaz de determinar quais strings são de arrayOfMessages[0,i] e arrayOfMessages[n,i] , onde n é o índice final da matriz.

Basta usar dois loops nesteds. Para obter os tamanhos das dimensões, você pode usar GetLength() :

 for (int i = 0; i < arrayOfMessages.GetLength(0); i++) { for (int j = 0; j < arrayOfMessages.GetLength(1); j++) { string s = arrayOfMessages[i, j]; Console.WriteLine(s); } } 

Isso pressupõe que você realmente tenha uma string[,] . No .net também é possível ter arrays multidimensionais que não são indexados a partir de 0. Nesse caso, eles precisam ser representados como Array em C # e você precisaria usar GetLowerBound() e GetUpperBound() obter os limites para cada dimensão.

Com um loop for nested:

 for (int row = 0; row < arrayOfMessages.GetLength(0); row++) { for (int col = 0; col < arrayOfMessages.GetLength(1); col++) { string message = arrayOfMessages[row,col]; // use the message } } 

Não use foreach – use loops nesteds for um, para cada dimensão do array.

Você pode obter o número de elementos em cada dimensão com o método GetLength .

Veja matrizes multidimensionais (guia de programação C #) no MSDN.

Algo assim funcionaria:

 int length0 = arrayOfMessages.GetUpperBound(0) + 1; int length1 = arrayOfMessages.GetUpperBound(1) + 1; for(int i=0; i 

Você pode usar o código abaixo para executar matrizes multidimensionais.

 foreach (String s in arrayOfMessages) { System.Console.WriteLine("{0}",s); } 

Parece que você encontrou uma resposta adequada para o seu problema, mas como o título pede uma multidimensional array (que eu leio como 2 ou mais ), e este é o primeiro resultado da pesquisa que obtive ao procurar por isso, adicionarei meu solução:

 public static class MultidimensionalArrayExtensions { ///  /// Projects each element of a sequence into a new form by incorporating the element's index. ///  /// The type of the elements of the array. /// A sequence of values to invoke the action on. /// An action to apply to each source element; the second parameter of the function represents the index of the source element. public static void ForEach(this Array array, Action action) { var dimensionSizes = Enumerable.Range(0, array.Rank).Select(i => array.GetLength(i)).ToArray(); ArrayForEach(dimensionSizes, action, new int[] { }, array); } private static void ArrayForEach(int[] dimensionSizes, Action action, int[] externalCoordinates, Array masterArray) { if (dimensionSizes.Length == 1) for (int i = 0; i < dimensionSizes[0]; i++) { var globalCoordinates = externalCoordinates.Concat(new[] { i }).ToArray(); var value = (T)masterArray.GetValue(globalCoordinates); action(value, globalCoordinates); } else for (int i = 0; i < dimensionSizes[0]; i++) ArrayForEach(dimensionSizes.Skip(1).ToArray(), action, externalCoordinates.Concat(new[] { i }).ToArray(), masterArray); } public static void PopulateArray(this Array array, Func calculateElement) { array.ForEach((element, indexArray) => array.SetValue(calculateElement(indexArray), indexArray)); } } 

Exemplo de uso:

 var foo = new string[,] { { "a", "b" }, { "c", "d" } }; foo.ForEach((value, coords) => Console.WriteLine("(" + String.Join(", ", coords) + $")={value}")); // outputs: // (0, 0)=a // (0, 1)=b // (1, 0)=c // (1, 1)=d // Gives a 10d array where each element equals the sum of its coordinates: var bar = new int[4, 4, 4, 5, 6, 5, 4, 4, 4, 5]; bar.PopulateArray(coords => coords.Sum()); 

A ideia geral é recorrer a dimensões. Tenho certeza de que as funções não ganharão prêmios de eficiência, mas funciona como um inicializador único para minha estrutura e vem com um ForEach bom o suficiente que expõe os valores e índices. A principal desvantagem que não resolvi é conseguir que ele reconheça automaticamente T a partir do Array, portanto, é necessária alguma caucanvas quando se trata do tipo de segurança.