C#配列を理解する
C#の配列は基本的なデータ構造で、開発者は同じ型の要素のコレクションを連続したメモリ位置に格納することができます。 配列には、一次元、多次元、ギザギザがあります。
C#の配列に関するこの記事は、レイラ・ポーターの教育用ビデオ"C# for Beginners Part 5 - Arrays and More Loops."にインスパイアされたものです。レイラのビデオでは、配列の基本を掘り下げ、C#のループテクニックを紹介し、視聴者にコレクションを管理し、データを効率的に反復処理するための必須スキルを身に付けさせます。
配列について
レイラはまず、C#における固定長のコレクションとしての配列について説明する。 配列のサイズが動的に変化する他のプログラミング言語とは異なり、C#の配列は一度作成されると不変です。 これは、メモリ割り当ての制約により、初期化後にサイズを変更できないことを意味します。
シンプルなコンソール操作:お気に入りのチーズを選ぶ
次のコードでは、配列とは対照的に、Layla (1:50)はまず、ユーザーが選択できる項目のリストを提示する方法を示します。
Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("Hello, what is your favourite cheese from this list?");
Console.WriteLine("1. Stilton");
Console.WriteLine("2. Cheddar");
Console.WriteLine("3. Pineapple");
Console.WriteLine("4. Brie");
var favouriteCheese = Console.ReadLine();
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");このコードは最初にConsole.WriteLineを使って、ユーザーに好きなチーズを聞くメッセージをコンソールに出力します。 その後、Console.WriteLineを4回使用して、チーズのリストをコンソールに出力します。 その後コードは、favouriteCheeseに格納します。 最後に、このコードはConsole.WriteLineを再度使用して、ユーザーの好きなチーズを含むメッセージをコンソールに出力します。
2:04から、レイラがこのコードを実行して、どのように動作するかを示しています:

配列を宣言する - 配列の初期化
説明するために、Laylaは文字列の配列を宣言して初期化する方法(この場合は、メニューとしてユーザーに最初に提示されたチーズのリスト)を示すことから始めます。 彼女は、一次元配列を定義する構文(2:30)と、中かっこを使って初期値を入れる構文(2:54)を紹介する。
string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };string[] cheeses = { "Brie", "Cheddar", "Stilton", "Gouda" };レイラは、配列におけるゼロベースのインデックスの重要性を強調します。レイラは次に、forループを使って配列を繰り返し処理する方法を説明する。このループ構造は、指定された条件に基づいてコードを繰り返し実行できるため、プログラミングにおいて極めて重要である。
ループの実装
ループの話に移り、Laylaは、イニシャライザ、条件、イテレータという3つの重要な要素を持つforループを紹介する。 このループは、配列の要素をその長さに基づいて繰り返し処理するために使用されます。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(cheeses[i]);
}彼女は4:44で、cheeses.Lengthが配列の要素数を示しており、ループが各要素を正確に繰り返し処理することを強調しています。 変数iは、インデックスを反復処理するためのインデックス変数として機能します。 これは上記に示されているように、配列要素にアクセスすることなく、Console.WriteLineメソッドを書き込むことなく、個別の配列要素を効果的に出力します。 レイラは、6:17で、アプリケーションを実行し、このforループの出力が前の例とまったく同じであることを示す:

ソートと変更可能性
Laylaは並べ替えの利点を説明し、7:17でSortメソッドを使用して配列をアルファベット順に並べ替える方法を実演していますが、並べ替えによりC#での配列の不変性により、実際には背後で新しい配列が作成されることに注意が必要です。 これは、データ操作がメモリやパフォーマンスにどのように影響するかを理解する上で重要なポイントです。
Array.Sort(cheeses);Array.Sort(cheeses);彼女はまた、配列内の個々の要素が、新しい配列を作成することなく直接変更できることを示し(8:10)、不変の中の可変性を説明している。 置き換える要素のインデックスは、cheeses配列変数の後に角括弧で渡されます:
cheeses[0] = "Roquefort";cheeses[0] = "Roquefort";これは、インデックス 0 の配列要素 "Brie" を新しい値 "Roquefort" に置き換えます。
チーズリストを更新する:新しいエントリーの処理 (8:46)
レイラは、既存のリストに値を追加する方法を説明します。これは、既存の値と新しい値を取得し、両方を含む新しい配列を作成し、この新しい配列を指すように参照を更新することを含みます。 次のコードは、その仕組みを示しています:
var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}var favouriteCheese = Console.ReadLine();
bool containsFavourite = false;
foreach (var cheese in cheeses)
{
if (favouriteCheese == cheese)
{
containsFavourite = true;
}
}
if (!containsFavourite)
{
cheeses = cheeses.Append(favouriteCheese).ToArray();
}この例は、基本的な配列操作とAppendメソッドを使って配列に追加します(13:33)。
Laylaは13:50で、IEnumerableを返します。 これを修正するために、cheesesに再度割り当てます。 Laylaは、黄色い波線がコンパイラの警告であり、favouriteCheeseがnullである可能性があるといった問題を示しているが、このデモでは安全性チェックを無視していると述べています。
チーズリストの更新と印刷
レイラは、配列に新しい項目を追加したら、更新されたリストを画面に印刷する必要があると説明しています。 これを達成するために、forループを使用し、各要素をそのインデックスと一緒に出力して、配列がより多くのアイテムを含むようになったことを示します。
Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");Console.WriteLine("The new list:");
for (var i = 0; i < cheeses.Length; i++)
{
Console.WriteLine(i + " " + cheeses[i]);
}
Console.WriteLine($"Here is a lump of {favouriteCheese} cheese!");C#における配列の動的な性質を示し、新しい要素を追加し、配列の内容を表示して更新を確認する方法を示します。
そして、Laylaは新しく追加されたチーズを表示するためにアプリケーションを実行する(15:19):

オブジェクト配列で拡張する
理解を広げるために、LaylaはStrengthのプロパティを持つオブジェクトの配列を導入します (16:14)。 その後彼女は文字列リストを置き換えてCheeseオブジェクトの配列を作成し、反復中にオブジェクト内のプロパティにアクセスする方法を示します (17:46)。
class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);class Cheese
{
public string Name { get; set; }
public int Strength { get; set; }
public Cheese(string name, int strength)
{
Name = name;
Strength = strength;
}
}
Cheese[] cheeses = new Cheese[]
{
new Cheese("Stilton", 3),
new Cheese("Cheddar", 2),
new Cheese("Pineapple", 1),
new Cheese("Brie", 2)
};
cheeses[0] = new Cheese("Roquefort", 4);このセクションでは、配列がどのように複雑なデータ構造をカプセル化し、プログラミングに柔軟性とパワーを提供するかについて、基礎的な理解を提供します。
ループでチーズオブジェクトを使用する
Laylaは今、更新されたリストのすべての要素を画面に印刷する方法を示しています。 このシナリオでは、各チーズがプロパティStrengthを持つオブジェクトとして表現されています。 Cheeseオブジェクトのこの配列を反復処理し、各反復で1つの配列要素を直接処理します。
for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}for (int i = 0; i < cheeses.Length; i++)
{
Console.WriteLine($"{cheeses[i].Name}, Strength: {cheeses[i].Strength}");
}このループは、cheeses配列に格納された形で簡素化します。 レイラは20:34にプログラムを実行し、出力は次のようになります:

結論
結論として、レイラ・ポーターのC#における配列とループに関するチュートリアルは、初心者がこれらの重要な概念を理解するための強固な基礎を提供します。配列とさまざまなループ構造をマスターすることで、C# 開発者を目指す人は、プログラムの中でデータ構造を効果的に操作し、コレクションを反復処理できるようになります。 これらの基礎を理解することは、より複雑なアプリケーションを構築し、C#プログラミングのさらなる側面を探求する上で非常に重要です。
Laylaの例と解説に従うことで、初心者は自分のC#プロジェクトで配列とループを効果的に使用する自信を得ることができます。 C#のコレクションや高度な2次元配列、ギザギザ配列の詳細については、後続のチュートリアルや実践的な演習を参照することをお勧めします。




