C#では、データを扱うために配列やコレクションを使用します。これらはデータの格納や管理を容易にし、効率的に操作できるため、プログラミングにおいて非常に重要です。この章では、基本的な配列操作から、List
やDictionary
などのコレクション、さらにLINQを使った高度なデータ操作方法まで、具体的な例を交えて学んでいきます。
8.1 配列の定義と初期化、要素のアクセス方法
配列は、同じ型の複数のデータを1つのまとまりとして格納するデータ構造です。C#では、配列を使って効率的にデータを管理できます。
配列の定義と初期化
// 要素数を指定して配列を定義
int[] numbers = new int[5]; // 5つの要素を持つint型の配列
// 要素を直接指定して初期化
int[] primes = new int[] { 2, 3, 5, 7, 11 };
// 簡略化した初期化(new int[] を省略)
int[] evenNumbers = { 2, 4, 6, 8, 10 };
配列の要素へのアクセス
int firstPrime = primes[0]; // 配列の最初の要素(2)を取得
primes[2] = 17; // 配列の3番目の要素を変更(5 → 17)
配列の操作
// 配列の全要素を表示する
for (int i = 0; i < primes.Length; i++)
{
Console.WriteLine(primes[i]);
}
解説
– 配列はメモリ上に連続して格納され、要素へのアクセスが高速です。インデックスを使用して、任意の位置の要素にアクセスまたは変更できます。
– 配列は要素数が固定されているため、途中でサイズを変更することはできません。この制約を解消するためには、List
などのコレクションを使うことが一般的です。
8.2 多次元配列とジャグ配列の使い分け
C#では、1次元の配列に加え、多次元配列やジャグ配列(不規則な形の配列)もサポートしています。これらを使うことで、より複雑なデータ構造を扱うことができます。
多次元配列
int[,] matrix = new int[3, 3]
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
// 要素へのアクセス
int element = matrix[1, 2]; // 6
ジャグ配列
int[][] jaggedArray = new int[3][]
{
new int[] { 1, 2 },
new int[] { 3, 4, 5 },
new int[] { 6 }
};
// 要素へのアクセス
int jaggedElement = jaggedArray[1][2]; // 5
解説
– 多次元配列は、固定された行数と列数を持つデータ(行列など)を扱う場合に便利です。
– ジャグ配列は、各行ごとに異なる長さを持つデータを扱う場合に適しています。行ごとに異なるデータ構造を持つ場合に役立ちます。
8.3 List, Dictionary, Queue, Stackの基本操作
C#には、データを効率よく管理するための強力なコレクションが用意されています。これらは、配列に比べて柔軟なサイズ変更や高度な操作をサポートします。
List
List<int> numbers = new List<int>() { 1, 2, 3, 4 };
numbers.Add(5); // 要素を追加
numbers.Remove(3); // 要素を削除
int count = numbers.Count; // 要素数を取得</int></int>
Dictionary
Dictionary<string, int> ages = new Dictionary<string, int>()
{
{ "Alice", 25 },
{ "Bob", 30 }
};
ages["Charlie"] = 35; // 要素を追加
int ageOfAlice = ages["Alice"]; // 値にアクセス
Queue
Queue<string> queue = new Queue<string>();
queue.Enqueue("First");
queue.Enqueue("Second");
string dequeued = queue.Dequeue(); // "First"が取り出される</string></string>
Stack
Stack<string> stack = new Stack<string>();
stack.Push("Top");
stack.Push("Bottom");
string popped = stack.Pop(); // "Bottom"が取り出される</string></string>
解説
– List
: サイズの変動が多い場合や、要素の追加・削除が頻繁に行われる場合に便利です。
– Dictionary
: キーと値の組み合わせを効率的に管理でき、キーを使って素早く値を検索できます。連想配列としても利用できます。
– Queue
: 先に入れたものを先に処理する(FIFO)場面、例えばプリントジョブの管理やタスクキューでよく使われます。
– Stack
: 後に入れたものを先に処理する(LIFO)場面、例えば戻る操作や再帰的なアルゴリズムの実装で使われます。
8.4 LINQを使ったデータの操作 (Where, Select, OrderByなど)
LINQ(Language-Integrated Query)は、コレクションや配列などのデータをSQLのようなクエリ構文で操作できる強力なツールです。データの検索、フィルタリング、ソートなどを簡単に行えます。
LINQの基本操作
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 偶数だけを抽出
var evenNumbers = numbers.Where(n => n % 2 == 0);
// 値を2倍に変換
var doubledNumbers = numbers.Select(n => n * 2);
// 昇順にソート
var sortedNumbers = numbers.OrderBy(n => n);
// 結果の表示
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // 2, 4, 6, 8, 10
}</int></int>
解説
– Where
: 条件に一致する要素をフィルタリングします。
– Select
: 各要素に対して変換を行い、新しいコレクションを作成します。
– OrderBy
: 要素を昇順や降順にソートします。
LINQを使うことで、複雑なデータ処理も非常にシンプルに記述できます。
8.5 コレクションの反復処理 (foreachループ)
C#のforeach
ループは、コレクションや配列内の全要素に対して反復処理を行う最も簡単な方法です。for
ループよりも簡潔で、インデックス操作が不要なため可読性が高まります。
foreachループの基本
List<string> fruits = new List<string>() { "Apple", "Banana", "Cherry" };
foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}</string></string>
解説
– foreach
ループは、コレクションの全要素を1つずつ順番に処理するのに使います。
– forループ
と異なり、インデックス操作が不要で、コードが簡潔になるため、特にコレクション全体を処理する場合に便利です。
まとめ
この章では、C#における配列とコレクションの基本的な操作方法を学びました。配列の基本から多次元配列、ジャグ配列、List
、Dictionary
、Queue
、Stack
などのコレクションの使用方法、そしてLINQを使ったデータ操作まで幅広くカバーしました。これらのデータ構造とツールを使うことで、効率的で柔軟なプログラムが書けるようになります。
コメント