foreach (String s in arrayOfMessages)
{
System.Console.WriteLine(s);
}
string[,] arrayOfMessages
がパラメータとして渡されています。多次元配列をどのようにループしますか?
どの文字列がarrayOfMessages[0,i]
とarrayOfMessages[n,i]
であるかを知りたい場合は、n
が配列の最終インデックスです。
foreach (String s in arrayOfMessages)
{
System.Console.WriteLine(s);
}
string[,] arrayOfMessages
がパラメータとして渡されています。多次元配列をどのようにループしますか?
どの文字列がarrayOfMessages[0,i]
とarrayOfMessages[n,i]
であるかを知りたい場合は、n
が配列の最終インデックスです。
単に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()
を使用する必要があります。このような
foreach
- 配列の各次元に1つずつ、ネストされたfor
ループを使用しないでください。
GetLength
メソッドを使用すると、各ディメンションの要素数を取得できます。
MSDNのMultidimensional Arrays (C# Programming Guide)を参照してください。ループの入れ子になったと
:
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
}
}
何かが働くだろう:
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]; ... }
あなたは多次元配列を実行するために以下のコードを使用することができます。
foreach (String s in arrayOfMessages)
{
System.Console.WriteLine("{0}",s);
}
あなたはあなたの問題の答えは適したように見えますが、タイトルは(私は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を自動的に認識させることです。型の安全性に関しては、いくつかの注意が必要です。
なぜインデックスを持つループを使用しないのですか? –