2 次元配列は、行列の形式を想定した、複数の行と列にまたがる同種の要素のコレクションです。以下は、m 行 n 列を持ち、m x n 構成の行列を作成する 2D 配列の例です。
[ a1, a2, a3, a4, ..., an b1, b2, b3, b4, ..., bn c1, c2, c3, c4, ..., cn . . . m1, m2, m3, m4, ..., mn ]
Jagged Array は、配列の配列です。ギザギザ配列は基本的に、複数の配列がギザギザになって多次元配列を形成したものです。 2 次元のギザギザ配列は次のようになります:
[ [ a1, a2, a3, a4, ..., an ], [ b1, b2, b3, b4, ..., b20 ], [ c1, c2, c3, c4, ..., c30 ], . . . [ m1, m2, m3, m4, ..., m25 ] ]
ギザギザ配列のすべての行に同じ数の要素が含まれる場合と含まれない場合があることに注意してください。
実装の観点から見ると、ジャグ配列は真の 2D 配列とはまったく異なります。 C# が多次元配列とギザギザ配列の両方をどのように実装するかを理解することが重要です。
プログラミング言語は、多次元配列の実装が異なります。 C、C++、C#、Fortran などの一部のプログラミング言語は、真の 2D 配列をサポートしています。一方、配列の配列、別名ギザギザ配列を使用してこの動作をシミュレートするものもあります。では、真の 2 次元配列はギザギザ配列とどう違うのでしょうか?
多次元配列の 2 つの実装は、ストレージ消費量の点で異なります。真の 2D 配列には、それぞれ n 要素の m 行が含まれますが、ギザギザ配列には、それぞれ異なる要素数を持つ m 行が含まれる可能性があります。これにより、データセットの無駄なスペースが最小限に抑えられます。したがって、以下のギザギザの配列はまったく問題ありません:
int[][] jagged array = [ [1, 2, 3, 4], [5, 6, 7], [8, 9] ]
同じデータセットが真の 2D 配列に実装された場合は、次のようになります。
int[,] multiDimArray = [ 1, 2, 3, 4 5, 6, 7, 0 8, 9, 0, 0 ]
ここでは、2D 配列に対するいくつかの操作を以下に示します。
C# で 2D 配列を宣言する方法と、C# で 2D 配列を宣言しない別の方法を見てみましょう。
どうやって?
C# での真の 2D 配列の実装は、配列の宣言から始まります。以下のようになります:
int[,] arr2D; string[,] arr2D_s;
定義内のカンマの数によって、配列の次元が決まります。配列宣言では配列のサイズを指定できないことに注意してください。これは配列の初期化中に行う必要があります。
そうしない方法はありますか?
2D 配列の実装とギザギザ配列の実装は混同されやすいです。ギザギザの配列宣言は次のようになります:
int[][] jagged array;
次のステップは、宣言したばかりの 2D 配列を初期化することです。それにはいくつかの方法があります。
新しい演算子の使用
arr2D = new int[2,3]; //separate initialization string[,] arr2D_s = new string[4,5]; //with declaration
値を使用して初期化しています
//without dimensions arr2D = new int[,]{{1,2}, {3,4}, {5,6}}; //with declaration arr2D_s = new string[2,2]{{"one","two"},{"three", "four"}};
新しいオペレーターなし
Int[,] arr2D_a = {{1,2}, {3,4}, {5,6}, {7,8}};
単一要素を読み取る
次の操作は、2D 配列から要素を読み取ることです。 2D 配列は m x n 要素の行列であるため、各要素には指定された行インデックスと列インデックスの組み合わせがあります。添字に行インデックスと列インデックスを指定することで要素にアクセスできます。例を以下に示します。
int[,] arr2D_i = {{1,2}, {3,4}, {5,6}, {7,8}}; string arr2D_s = {{"one","two"},{"three", "four"}}; int val_i = arr2D_i[2,1]; //returns '6' string val_s = arr2D_s[1,1]; //returns 'four'注- 行と列のインデックスは 0 から始まります。したがって、インデックス位置 [0,0] が配列の最初の要素、[m-1, n-1] が最後の要素になります。
すべての要素を読む
ただし、上記のメソッドでは、配列内の単一要素の値が得られます。配列全体を走査してその各要素を読み取るにはどうすればよいでしょうか?簡単な解決策は、ネストされた for/while ループを使用して配列全体をループすることです。
コード
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; //reading all the elements through for loop for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Console.Write(arr2D_i[i, j] + "\t"); } Console.WriteLine("\n"); } } }
出力
GetLength() メソッド
わかりました。ただし、上記の例は、配列内の要素の数が事前にわかっている場合にのみ機能します。配列が動的である場合はどうなりますか?動的配列のすべての要素を走査するにはどうすればよいですか?ここで、GetLength メソッドが役に立ちます。
int arr2D.GetLength(0); // 最初の次元 (行) を返します
int arr2D.GetLength(1); // 2 番目の次元 (列) を返します
コード
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; //reading all the elements through for loop for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { Console.Write(arr2D_i[i, j] + "\t"); } Console.WriteLine("\n"); } } }
出力
for each ループのパワー
for-each ループは、配列の各要素に対して一連のコマンドを実行します。これは非常に強力なループ メカニズムであり、従来の for ループよりも効率的であるため、使用することを強くお勧めします。
コード
using System; public class Program { public static void Main() { string[,] arr2D_s = new string[3, 3]{{"one", "two", "three"}, {"four","five","six"}, {"seven","eight","nine"}}; //reading all the elements through foreach loop foreach(var ele in arr2D_s) { Console.WriteLine(ele); } } }
出力
次に、C# 2D 配列に要素を挿入する方法の例を見てみましょう。アイデアは、配列の各位置を走査し、それに値を割り当てることです。
コード
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[,] squares = new int[3, 3]; int[,] cubes = new int[3, 3]; for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { squares[i, j] = arr2D_i[i, j] * arr2D_i[i, j]; cubes[i, j] = squares[i, j] * arr2D_i[i, j]; } } Console.WriteLine("Squares\n"); DisplayArray(squares); Console.WriteLine("\n\nCubes\n"); DisplayArray(cubes); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
We will update our array to multiply each element with 2. The idea is to traverse each position of the array and update the value it holds.
Code
using System; public class Program { public static void Main() { int[, ] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; Console.WriteLine("Original Array\n"); DisplayArray(arr2D_i); for (int i = 0; i < arr2D_i.GetLength(0); i++) { for (int j = 0; j < arr2D_i.GetLength(1); j++) { arr2D_i[i, j] *= 2; } } Console.WriteLine("\n\nUpdated Array (multiplied by 2)\n"); DisplayArray(arr2D_i); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
This is a tricky operation. It is not possible to delete a single element from a true C# 2D Array. Deleting a single element will disturb the dimensions of the array such that it would no longer be a matrix. C# does not allow that unless it is a jagged array.
So, what is the solution? Do we delete the entire row or the entire column? No, C# would not allow that as well. The array is fixed in size when declared or initialized. It has fix bytes of memory allocated. We cannot change that at run time.
The solution here is to create a new array without the elements that we want to delete.
Code
using System; public class Program { public static void Main() { int[,] arr2D_i = new int[3, 3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int[,] new_array = new int[2,2]; Console.WriteLine("Original Array\n"); DisplayArray(arr2D_i); int rowToDel = 2; int colToDel = 2; for (int i = 0; i < arr2D_i.GetLength(0); i++) { if(i==rowToDel) continue; for (int j = 0; j < arr2D_i.GetLength(1); j++) { if(j==colToDel) continue; new_array[i,j]=arr2D_i[i,j]; } } Console.WriteLine("\n\nArray after deleting elements\n"); DisplayArray(new_array); } static void DisplayArray(int[, ] arr) { for (int i = 0; i < arr.GetLength(0); i++) { for (int j = 0; j < arr.GetLength(1); j++) { Console.Write(arr[i, j] + "\t"); } Console.WriteLine("\n"); } } }
Output
Thus, we have seen how a 2D Array is implemented in C# and what are the various CRUD operations we can perform on it. We also learned the difference between a true 2D implementation and a jagged array. There are a lot more methods available in C# to assist the developers with working with Arrays at ease. Do check them out at the MSDN docs.
This is a guide to 2D Arrays in C#. Here we discuss the concept of jagged arrays along with operations on 2D arrays in C#. You may also look at the following articles to learn more-
以上がC# の 2D 配列の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。