このループはジャグ配列に基づいており、その下ではさまざまな場所で複数回使用する必要があります。
このループを何度も書き直して複製するのを防ぐにはどうすればよいですか?
foreach (int[] columns in rowsAndColumns)
{
foreach (int element in columns)
{
}
}
このループはジャグ配列に基づいており、その下ではさまざまな場所で複数回使用する必要があります。
このループを何度も書き直して複製するのを防ぐにはどうすればよいですか?
foreach (int[] columns in rowsAndColumns)
{
foreach (int element in columns)
{
}
}
あなたは書ける
foreach (int element in rowsAndColumns.SelectMany(col => col))
{
// ...
}
代わりは。常に入力する必要がない場合は、ヘルパーメソッドに抽象化できます。
foreach (int element in rowsAndColumns.Flatten())
{
// ...
}
// [...]
public IEnumerable<T> Flatten(this IEnumerable<IEnumerable<T>> source)
{
return source.SelectMany(e => e);
}
何をしたいのかにもよりますが、各 int に対してアクションを実行したい場合は、以下の拡張のようなものを使用できます。いくつかの null チェックが推奨される場合があります。
static class RowColExtension
{
public static void Each(this int[][] rowCols, Action<int> a)
{
foreach (var r in rowCols)
{
foreach (var c in r)
{
a(c);
}
}
}
}
ループで何をしたいかによります。私はこのようにアプローチします(私の頭からのテストされていないコード!):
public static class MyHelper {
public static void ForEach(this IEnumerable<int[]> rowsAndColumns, Action<int> action) {
foreach (int[] columns in rowsAndColumns) {
foreach (int element in columns) {
action(element);
}
}
}
}
今、あなたはそれをこのように呼ぶことができます:
rowsAndColumns.ForEach(e => Console.WriteLine(e));
延長方法:
// It's late and I'm tired, the array declaration might be off.
public static void Visit(this int[][] array, Action<int> visitor)
{
foreach (int[] columns in array)
{
foreach (int element in columns)
{
visitor(element);
}
}
}
myArray.Visit(elem => Console.WriteLine(elem));
行を取得するために使用することもできますAction<int,int>
。
行または列に関係なくすべての要素を反復処理しているため、ジャグ配列をファースト クラスのデータ構造に変換IEnumerable
し、 を使用してコレクションを反復処理するように実装する必要がありますforeach
。同じファーストクラスのデータ構造で、1 引数および 2 引数のインデクサー、範囲チェックなどをサポートできます。
編集:
低レベルのデータ構造を操作する代わりに、抽象化を使用する 1 つのアプローチを次に示します。これは、ジャグ配列が別の場所に割り当てられていることを前提としています。いずれにせよ、ポイントはforeach
、データ構造で直接使用できるようになったことです。
public class JaggedArray : IEnumerable<int>
{
private int[][] array;
public JaggedArray(int[][] array)
{
this.array = array;
}
public int this[int row, int column]
{
get { return array[row][column]; }
set { array[row][column] = value; }
}
public IEnumerable<int[]> Rows
{
get { return array; }
}
public IEnumerator<int> GetEnumerator()
{
foreach (var row in array)
foreach (var item in row)
yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}