ここでは変数の延長としてC#で配列を利用する方法を学びます。
なお、配列自体が分からない人は先に次の記事に読んでください。
プログラムで利用する便利な配列、これをコンピュータサイエンスの視点から理解しましょう。汎用的な知識を得ることで、効率のいいコードが書けたり、別のプログラミング言語を学ぶ時の役に立ちます。配列 (array) の概念配列は変数の集合です。例えばユーザー4人の年齢を管理する場合、変数を4つ用意しても実現できますが、それでは使い勝手が悪いです。なので1つだけ変数を作ってアドレス値を管理、そのアドレス値を起点に複数個のデータを管理するのが配列です。配列とメモリの関係変数と...
配列は参照型
最初に覚えることはC#の配列は参照型ということです。ここでポイントになるのは配列を示す変数が参照型です。
関数(※1)を学んだことで、ついに値型と参照型の違いを知ることができます。ここではC#で最重要とも言える値型と参照型の違いを理解しましょう。※1現在の知識を踏まえて、ここではメソッドではなく関数と呼びます。値型と参照型の復習まずは値型と参照型について復習しましょう。この2つは値を保存する場所が大きなポイントになります。値型値型とは用意した領域に直接的に値を保存します。参照型参照型は値を別の領域に格納し、それを...
例えばint型の配列を作った場合、配列を示す変数は参照型ですが、要素内の値はint型なので値型です。
これがstring型の場合、配列を示す変数は変わらず参照型ですが、要素内の値も参照型になります。
配列の宣言、初期化、要素アクセス
難しくないのでコードを見て覚えましょう。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
// 宣言
int[] array;
// 初期化
array = new int[] { 10, 20, 30 }; // 必要な要素数の数だけ初期化する
// 要素アクセス
Console.WriteLine(array[0]); // 前方からインデックス指定
Console.WriteLine(array[1]); // 〃
Console.WriteLine(array[2]); // 〃
Console.WriteLine();
Console.WriteLine(array[^1]); // 後方からインデックス指定
Console.WriteLine(array[^2]); // 〃
Console.WriteLine(array[^3]); // 〃
}
}
}
ポイントは[]を使って宣言してる部分です。これはint型の配列なのでint[]です。
では、string型の配列を作りたい場合はどうすればいいでしょうか?
string[]です。
その通り。ついでに初期化のnewは参照型を作る時に必要な記述だよ。
配列へのアクセスもコンピュータサイエンスでやったインデックスと同じだね。
逆順は学んだ記憶がありませんが。
これはC#なら許されてる記述だよ。他の言語は知らん。
逆順の注意点は0開始じゃなくて1開始のとこかな。何でだろうね。
宣言と同時に初期化する方法
これも例を見て覚えましょう。こんな感じに記述します。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
// 宣言と同時に初期化
int[] array1 = new int[] { 10, 20, 30 };
// ここまで省略可能
int[] array2 = { 100, 200, 300, }; // こんな感じに最後に,が付くのも許される
// 要素アクセス
Console.WriteLine(array1[0]);
Console.WriteLine(array1[1]);
Console.WriteLine(array1[2]);
Console.WriteLine(array2[0]);
Console.WriteLine(array2[1]);
Console.WriteLine(array2[2]);
}
}
}
C#では最後の要素に,(カンマ)を付けてもビルドエラーになりません。これが便利なので覚えておきましょう。
領域だけ確保する方法
配列は先に領域だけ確保することもできます。次の例を見てください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
// 領域だけ確保する
int[] array = new int[3];
// 初期化
array[1] = -100;
// 要素アクセス
Console.WriteLine(array[0]); // Default値で初期化された
Console.WriteLine(array[1]);
Console.WriteLine(array[2]); // Default値で初期化された
}
}
}
領域のみを確保する場合、領域の要素は型に応じた値で初期化されます。
先程の例ではint型を利用したので、全ての要素がDefault値の0で初期化されました。
配列は1つのオブジェクト
これはオブジェクト指向とクラスを理解してないと分かりづらいです。
ここではC#のクラスについて学びます。クラスはC#において最も大切な機能だと思ってます。それもあって最低限の内容を書いたつもりが、何かめっちゃ長くなりました。疲れたら数回に分けて読んでください。クラス(class)クラスとは特定の機能を1つにまとめたものです。正直、説明が難しいのでコードを使って話します。最初に以下の記述方法とサンプルコードを見てください。これは車という機能をクラス化したコードです。// クラス public class Car { ...
C#において配列とは単なるメモリの連続領域ではありません。
1つのオブジェクトであり配列という機能を有します。
まずは次の例を見てください。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
int[] array = new int[] { 10, 20, 30, 40, 50 };
Console.WriteLine(array.Rank); // 次元数を取得する
Console.WriteLine(array.Length); // 配列の長さを取得する
}
}
}
本来なら変数arrayは単なるメモリの位置を示すに過ぎませんが、C#では.(ドット)演算子を利用して機能を呼び出すことができます。
この.演算子については現時点では分からなくて構いません。このようにオブジェクトが有する機能を利用できると思ってください。
そして先程の例では次元数と配列の長さを取得するメソッド(後のclass解説で学習)を呼び出しました。
結果的に変数arrayオブジェクトから次元数と長さを取得することができてます。
現状は変数名に.Rankで次元数、.Lengthで長さが取得できると暗記でも問題ないです。
しっかり進んでclassを理解できれば勝手に身につきます。
様々な配列
C#では先程の1次元配列に加えて多次元配列とジャグ配列を作成することができます。
多次元配列
これが多次元配列の記述方法です。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
// 領域だけ確保するパターン
int[,] array1 = new int[2, 3]; // 2 x 3 の要素を持つ多次元配列を作成する
// 初期化もするパターン
int[,] array2 = {
{ 10, 20, 30 },
{ 40, 50, 60 },
};
// 次元数と長さを取得
Console.WriteLine(array1.Rank); // 次元数を取得する
Console.WriteLine(array1.Length); // 長さを取得する
Console.WriteLine(array1.GetLength(0)); // 各次元の長さを取得する
Console.WriteLine(array1.GetLength(1)); // 〃
Console.WriteLine();
// 要素アクセス
Console.WriteLine(array1[0, 0]);
Console.WriteLine(array1[0, 1]);
Console.WriteLine(array1[0, 2]);
Console.WriteLine(array1[1, 0]);
Console.WriteLine(array1[1, 1]);
Console.WriteLine(array1[1, 2]);
Console.WriteLine();
Console.WriteLine(array2[0, 0]);
Console.WriteLine(array2[0, 1]);
Console.WriteLine(array2[0, 2]);
Console.WriteLine(array2[1, 0]);
Console.WriteLine(array2[1, 1]);
Console.WriteLine(array2[1, 2]);
}
}
}
ジャグ配列
こちらはジャグ配列の記述方法です。
namespace Sample
{
internal class Program
{
static void Main(string[] args)
{
// 領域だけ確保するパターン
int[][] array1 = new int[2][]; // 可変するので配列内の配列は要素数が未定
array1[0] = new int[2] { 10, 20 }; // 要素に配列を初期化
array1[1] = new int[4] { 30, 40, 50, 60 }; // 要素に配列を初期化
// 初期化もするパターン
int[][] array2 = new int[][] {
new int[] { 1, 2, 4, 8 },
new int[] { 1, 3, 9 },
new int[] { 0 },
};
// 次元数と長さを取得
Console.WriteLine(array1.Rank); // 次元数を取得する
Console.WriteLine(array1.Length); // 長さを取得する
Console.WriteLine(array1[0].Length); // あくまで配列の配列だから要素の長さを取得する
Console.WriteLine(array1[1].Length); // 〃
Console.WriteLine();
// 要素アクセス
Console.WriteLine(array1[0][0]);
Console.WriteLine(array1[0][1]);
Console.WriteLine(array1[1][0]);
Console.WriteLine(array1[1][1]);
Console.WriteLine(array1[1][2]);
Console.WriteLine(array1[1][3]);
Console.WriteLine();
Console.WriteLine(array2[0][0]);
Console.WriteLine(array2[0][1]);
Console.WriteLine(array2[0][2]);
Console.WriteLine(array2[0][3]);
Console.WriteLine(array2[1][0]);
Console.WriteLine(array2[1][1]);
Console.WriteLine(array2[1][2]);
Console.WriteLine(array2[0][0]);
}
}
}
どちらも[]の使い方でコントロールします。似てるので間違えないように注意しましょう。
あとがき
配列を理解しないとコードが地獄絵図になります。絶対に理解しましょう。
C言語だとint[] arrayじゃなくてint array[]って宣言するんだけど、同時に両方の案件を担当してると紛らわしすぎて頭おかしくなる。
一生キレてそう。
◆ C#に関する学習コンテンツ
この記事は参考になりましたか?
コメント