C#プログラミングにおいて、配列は非常に重要な概念です。
初心者の方でも理解しやすいよう、配列とは何か、どのように宣言するか、また配列を操作するための基本的なメソッドやプロパティについて解説していきます。
配列とは
配列とは、同じ型の複数の変数を一つの変数名で管理するためのデータ構造です。
例えば、整数型の変数を10個宣言する場合、以下のように書くことができます。
int num1, num2, num3, num4, num5, num6, num7, num8, num9, num10;
しかし、この方法では変数名が長くなり管理が煩雑になってしまいます。
そこで、配列を使うことで以下のように書くことができます。
int[] nums = new int[10];
このように宣言することで、nums
という一つの変数名で10個の整数型変数を管理することが出来ます。
また、配列は要素番号(インデックス)を指定してアクセスすることが出来るため、値の取得や代入も容易に行えます。
配列の宣言方法
配列とは、同じ型の複数の変数をまとめて扱うためのデータ構造です。
C#では、以下のようにして配列を宣言することができます。
// int型の要素を5つ持つ配列を宣言する
int[] array1 = new int[5];
// 初期値を指定した配列を宣言する
int[] array2 = { 1, 2, 3, 4, 5 };
// 配列の要素数は自動的に決定される
int[] array3 = new int[] { 1, 2, 3 };
上記の例では、array1
はint
型の要素を5つ持つ配列、array2
は初期値が指定されたint
型の要素を5つ持つ配列、そしてarray3
は初期値が指定されたint
型の要素を3つ持つ配列となります。
配列の要素へのアクセス方法
配列の要素にアクセスする方法は、インデックスを指定することです。
インデックスは0から始まります。
例えば、以下のようなint型の配列がある場合、
int[] numbers = { 1, 2, 3, 4, 5 };
最初の要素にアクセスするには、以下のようにします。
int firstNumber = numbers[0]; //配列の先頭は0番目
この場合、変数firstNumber
には1
が代入されます。
配列の要素の変更方法
配列の要素を変更するには、インデックスを指定して新しい値を代入します。
以下は、配列の2番目の要素を変更する例です。
int[] numbers = { 1, 2, 3, 4, 5 };
numbers[1] = 10;
この場合、numbers
配列の2番目の要素である2
が10
に変更されます。
また、forループなどを使って複数の要素を一括で変更することもできます。
以下は、配列の全ての要素に1を加える例です。
int[] numbers = { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Length; i++)
{
numbers[i] += 1;
}
この場合、numbers
配列の全ての要素がそれぞれ1ずつ加算されます。
注意点としては、配列が宣言された後にサイズが変更できないため、新しい値を代入する際には既存の要素数内で行う必要があります。
配列の要素の追加方法
配列に要素を追加する方法について説明します。
C#の配列は、宣言時に要素数を指定する必要があります。
そのため、通常は宣言後に要素を追加することはできません。
しかし、配列の長さを変更することができるList<T>
クラスを使用すれば、要素の追加や削除が可能です。
以下は、List<T>
クラスを使用して配列に要素を追加する例です。
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int>() { 1, 2, 3 };
numbers.Add(4);
Console.WriteLine(string.Join(",", numbers)); // 出力結果: 1,2,3,4
}
}
上記の例では、List<int>
クラスを使用して整数型のリストを作成し、初期値として1,2,3を設定しています。
その後、Add()
メソッドを使用して4をリストに追加しました。
最後にstring.Join()
メソッドでリスト内の全ての要素をカンマ区切りで出力しています。
このように、List<T>
クラスを使用すれば配列に要素を追加することができます。
ただし、リストは動的なデータ構造であるため、処理速度が遅くなる場合があります。
そのため、大量のデータ処理や高速なアルゴリズムが必要な場合は別途考慮する必要があります。
配列の要素の削除方法
配列の要素を削除する方法について説明します。
C#では、配列から要素を削除するための専用のメソッドはありません。
しかし、以下のような方法で要素を削除することができます。
方法1:新しい配列を作成して該当する要素以外をコピーする
この方法では、新しい配列を作成し、元の配列から該当する要素以外をコピーします。
具体的には、以下の手順で行います。
- 削除したい要素のインデックス番号を取得します。
- 新しい配列を元の配列より1つ小さく作成します。
- 元の配列から該当する要素以外を新しい配列にコピーします。
以下は、上記手順に従って実装したサンプルコードです。
int[] array = { 1, 2, 3, 4, 5 };
int index = 2; // 削除したい要素のインデックス番号
int[] newArray = new int[array.Length - 1];
for (int i = 0, j = 0; i < array.Length; i++)
{
if (i != index)
{
newArray[j] = array[i];
j++;
}
}
array = newArray;
上記コードでは、array
変数に格納された整数型の配列からインデックス番号が2(つまり3番目)の要素を削除しています。
新しく作成されたnewArray
変数には、削除後の結果が格納されます。
最後にarray
変数にnewArray
変数を代入しています。
方法2:Listクラスを使用する
C#では、動的なサイズ変更が可能なListクラスが提供されています。
このクラスでは、RemoveAtメソッドやRemoveメソッドなどで指定した位置や値と一致する要素を削除することができます。
以下は、Listクラスを使用して特定のインデックス番号または値と一致する要素を削除するサンプルコードです。
List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
list.RemoveAt(2); // インデックス番号が2(つまり3番目)の要素を削除
// list.Remove(3); // 値が3と一致する要素も同様に削除可能
上記コードでは、リストからインデックス番号が2(つまり3番目)の要素を削除しています。
Removeメソッドでも同様に値が一致する場合に削除可能です。
配列の要素の検索方法
配列の要素を検索する方法について簡単に紹介します。
線形探索法
線形探索法は、配列の先頭から順番に要素を比較していく方法です。
以下は、線形探索法で配列内の特定の値を検索するサンプルコードです。
int[] array = { 1, 3, 5, 7, 9 };
int target = 5;
for (int i = 0; i < array.Length; i++)
{
if (array[i] == target)
{
Console.WriteLine("要素が見つかりました。インデックスは{0}です", i);
break;
}
}
要素が見つかりました。インデックスは2です
この例では、array
という名前の整数型配列があります。
target
変数に検索したい値を代入し、forループで配列内の要素を順番に比較しています。
もし目的の値が見つかった場合は、そのインデックスを表示して処理を終了します。
二分探索法
二分探索法は、ソートされた配列内で目的の値を効率的に検索する方法です。
以下は、二分探索法で配列内の特定の値を検索するサンプルコードです。
int[] array = { 1, 3, 5, 7, 9 };
int target = 5;
int left = 0;
int right = array.Length - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (array[mid] == target)
{
Console.WriteLine("要素が見つかりました。
インデックスは{0}です。
", mid);
break;
}
else if (array[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
この例では、array
という名前の整数型配列があります。
まず、左端と右端のインデックスを設定し、中央値(mid)を計算します。
次に、中央値と目的の値を比較し、目的の値が中央より大きければ左側(小さければ右側)に範囲を絞って再度中央値を計算します。
これらの操作を繰り返すことで目的の値が見つかるまで範囲が狭められていきます。
配列の要素のソート方法
配列の要素をソートする方法について解説します。
C#では、ArrayクラスのSortメソッドを使用して配列の要素をソートすることができます。
Sortメソッドは、昇順または降順で配列の要素を並び替えることができます。
以下は、整数型の配列を昇順にソートする例です。
using System;
public class Hello{
public static void Main(){
int[] numbers = { 3, 1, 4, 2, 5 };
Array.Sort(numbers);
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine("numbers[{0}] = {1}", i,numbers[i]);
}
}
}
numbers[0] = 1
numbers[1] = 2
numbers[2] = 3
numbers[3] = 4
numbers[4] = 5
上記のコードでは、int型の配列numbersを宣言し、その要素に3, 1, 4, 2, 5
を代入しています。
そして、ArrayクラスのSortメソッドを使用してnumbers配列を昇順にソートしています。
また、降順にソートする場合は、昇順にソートした後にReverseメソッドを使用して反転させることで実現可能です。
using System;
public class Hello{
public static void Main(){
int[] numbers = { 3, 1, 4, 2, 5 };
Array.Sort(numbers);
Array.Reverse(numbers);
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine("numbers[{0}] = {1}", i,numbers[i]);
}
}
}
numbers[0] = 5
numbers[1] = 4
numbers[2] = 3
numbers[3] = 2
numbers[4] = 1
上記のコードでは、まず先程と同じくnumbers配列を昇順にソートしています。
その後、ArrayクラスのReverseメソッドを使用してnumbers配列を反転させることで降順に並び替えています。
なお、文字列型やオブジェクト型などでも同様にSortメソッドが使えます。
ただし、オブジェクト型では比較方法が定義されていない場合はエラーが発生するため注意が必要です。
以上がC#で配列の要素をソートするシンプルな方法です。
多次元配列の使い方
多次元配列は、1つの配列に複数の配列を格納することができます。
例えば、2次元配列は行と列の2つのインデックスを持ち、3次元配列はさらに深い階層を持ちます。
2次元配列の宣言方法
2次元配列を宣言するには、以下のようにします。
int[,] arrayName = new int[rowSize, columnSize];
rowSize
とcolumnSize
はそれぞれ行数と列数を表します。
2次元配列の初期化方法
2次元配列を宣言と同時に初期化するには、以下のようにします。
int[,] arrayName = { {1, 2}, {3, 4} };
この場合、arrayName[0,0]
は1
、arrayName[0,1]
は2
、arrayName[1,0]
は3
、arrayName[1,1]
は4
となります。
2次元配列の要素へのアクセス方法
2次元配列の要素にアクセスするには、以下のようにします。
int value = arrayName[rowIndex, columnIndex];
rowIndex
とcolumnIndex
はそれぞれ行番号と列番号を表します。
多次元配列の宣言方法と初期化方法
3次元以上の多次元配列も同様に宣言し初期化することができます。
以下は3次元配列を宣言して初期化する例です。
int[,,] arrayName = new int[,,]
{
{
{1, 2},
{3, 4}
},
{
{5, 6},
{7, 8}
}
};
多次元にすることでデータを扱いやすくなりますが、無意味に多次元にすると可読性が下がるので注意しましょう。
配列の応用例
配列はプログラミングにおいて非常に重要なデータ構造の一つです。
ここでは、配列を使った応用例を紹介します。
1. 最大値・最小値の求め方
配列の中から最大値や最小値を求める方法は、以下のようになります。
int[] numbers = { 10, 20, 30, 40, 50 };
int max = numbers.Max();
int min = numbers.Min();
Console.WriteLine("Max: " + max); // 出力結果: Max: 50
Console.WriteLine("Min: " + min); // 出力結果: Min: 10
2. 配列の合計値・平均値の求め方
配列の中から合計値や平均値を求める方法は、以下のようになります。
int[] numbers = { 10, 20, 30, 40, 50 };
int sum = numbers.Sum();
double average = numbers.Average();
Console.WriteLine("Sum: " + sum); // 出力結果: Sum: 150
Console.WriteLine("Average: " + average); // 出力結果: Average: 30
3. 配列のコピー方法
配列をコピーする方法は、以下のようになります。
int[] sourceArray = {1,2,3};
int[] destinationArray = new int[sourceArray.Length];
Array.Copy(sourceArray, destinationArray, sourceArray.Length);
この場合、destinationArray
にsourceArray
の中身が全てコピーされます。