2012-02-15 20 views
11
foreach (String s in arrayOfMessages) 
{ 
    System.Console.WriteLine(s); 
} 

string[,] arrayOfMessagesがパラメータとして渡されています。多次元配列をどのようにループしますか?

どの文字列がarrayOfMessages[0,i]arrayOfMessages[n,i]であるかを知りたい場合は、nが配列の最終インデックスです。

+1

なぜインデックスを持つループを使用しないのですか? –

答えて

30

単に2つの入れ子forループを使用します。寸法のサイズを取得するには、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); 
    } 
} 

これは、あなたが実際にstring[,]を前提としています。 .Netでは、0からインデックスされていない多次元配列を持つこともできます。その場合は、C#でArrayと表す必要があります。GetLowerBound()GetUpperBound()を使用する必要があります。このような

5

foreach - 配列の各次元に1つずつ、ネストされたforループを使用しないでください。

GetLengthメソッドを使用すると、各ディメンションの要素数を取得できます。

MSDNのMultidimensional Arrays (C# Programming Guide)を参照してください。ループの入れ子になったと

7

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 
    }  
} 
1

何かが働くだろう:

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

for(int i=0; i<length1; i++) { string msg = arrayOfMessages[0, i]; ... } 
for(int i=0; i<length1; i++) { string msg = arrayOfMessages[length0-1, i]; ... } 
1

あなたは多次元配列を実行するために以下のコードを使用することができます。

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

あなたはあなたの問題の答えは適したように見えますが、タイトルは(私は2 以上と読む)多次元配列を要求するので、これは私が得た最初の検索結果です

public static class MultidimensionalArrayExtensions 
{ 
    /// <summary> 
    /// Projects each element of a sequence into a new form by incorporating the element's index. 
    /// </summary> 
    /// <typeparam name="T">The type of the elements of the array.</typeparam> 
    /// <param name="array">A sequence of values to invoke the action on.</param> 
    /// <param name="action">An action to apply to each source element; the second parameter of the function represents the index of the source element.</param> 
    public static void ForEach<T>(this Array array, Action<T, int[]> action) 
    { 
     var dimensionSizes = Enumerable.Range(0, array.Rank).Select(i => array.GetLength(i)).ToArray(); 
     ArrayForEach(dimensionSizes, action, new int[] { }, array); 
    } 
    private static void ArrayForEach<T>(int[] dimensionSizes, Action<T, int[]> 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<T>(this Array array, Func<int[], T> calculateElement) 
    { 
     array.ForEach<T>((element, indexArray) => array.SetValue(calculateElement(indexArray), indexArray)); 
    } 
} 

使用例:

var foo = new string[,] { { "a", "b" }, { "c", "d" } }; 
foo.ForEach<string>((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()); 

一般的な考え方は、寸法を下に再帰的であることを検索すると、私は自分のソリューションを追加します。関数が効率的な賞を獲得できないと確信していますが、それは私の格子のための1回限りの初期設定として機能し、値とインデックスを公開する充分なForEachが付属しています。私が解決していない主な欠点は、ArrayからTを自動的に認識させることです。型の安全性に関しては、いくつかの注意が必要です。

関連する問題