コレクション【C#】

C#文法:コレクション

本書は「C#文法:コレクション」コースの内容を書籍化したものです。本章では、コースの導入として、このコースで扱う内容の全体像を紹介します。

図1 コースタイトル「コレクション【C#】」

このコースで扱う内容

C#のコレクションは扱う範囲が非常に広いテーマです。そのため、コレクションに関する内容はいくつかのコースに分けて解説していく予定です。今回のコースで扱うのは、次の4つのテーマです。

図2 今回のコースで扱う内容の全体像

大きな流れとしては、「配列」からスタートし、配列を使いやすくするために生まれたコレクションを時代順にたどりながら「ArrayList」「List<T>」を解説し、最後にそれらを扱ううえで欠かせない「コレクションインタフェース」を解説する、という構成になっています。

配列 ― すべてのコレクションの土台

図3 配列はすべてのコレクションの土台

最初に扱うのは配列です。配列はすべてのコレクションの土台となる存在です。この後に登場するさまざまなリスト系のコレクションも、内部的には配列を使いやすくするという意図で作られています。

配列は型を指定して生成するため型安全ですが、生成時に要素数を決める必要があり、あとから要素を増減させるのが面倒という特徴があります。たとえば次のようなコードです。

参考コード:配列の生成

// 要素数を指定して生成(要素数はあとから変えられない)
int[] hai = new int[3];
hai[0] = 10;
hai[1] = 20;
hai[2] = 30;
 
// 生成と同時に値を設定することもできる
int[] hai2 = { 10, 20, 30 };

ArrayListとList<T> ― 時代をたどりながら

図4 ArrayListとList<T>

配列を使いやすくするという意図で、さまざまなリストが用意されています。本コースでは、それらを時代をたどりながら解説していきます。

ArrayList

図5 ArrayList:型を指定しない古いコレクション

ArrayListは、ここで扱う中で一番古いコレクションです。要素の追加や削除は簡単に行えますが、型を指定しないコレクションであるため、どんな型の値でも入ってしまいます。また、要素を取り出すときにはキャストが必要になり、型が合わなければ実行時にエラーとなります。

参考コード:ArrayListの例

using System.Collections;
 
var list = new ArrayList();
list.Add(10);
list.Add("ABC");            // 型を指定しないため何でも入ってしまう
 
int value1 = (int)list[0];  // 取り出すときはキャストが必要
int value2 = (int)list[1];  // 実行時にInvalidCastExceptionが発生

 

List<T>

図6 List<T>:.NET Framework 2.0から使える型安全なジェネリックコレクション

List<T>は、.NET Framework 2.0から使えるようになったジェネリックのコレクションです。型パラメーターTで要素の型を指定するため型安全であり、なおかつ配列と違って要素数を自由に増減できます。つまり、配列とArrayListそれぞれのデメリットを解消したコレクションといえます。本コースでは、このList<T>を使ったコレクションの使い方を解説していきます。

参考コード:List<T>の例

var list = new List<int>();
list.Add(10);
list.Add(20);
// list.Add("ABC");       // コンパイルエラー(型安全)
 
int value = list[0];      // キャスト不要
Console.WriteLine(list.Count);  // 2

 

コレクションインタフェース

図7 コレクションインタフェース:IEnumerable<T> / ICollection<T> / IList<T>など

最後に解説するのがコレクションインタフェースです。これはIEnumerable<T>、ICollection<T>、IList<T>といったインタフェースのことで、実際の開発でもよく使われます。

本コースでは、これらのインタフェースがなぜ必要なのか、そしてどのように使い分けるのかを解説していきます。たとえば、メソッドの引数をList<T>ではなくインタフェースで受け取るようにすると、そのメソッドで「何ができるか」を必要な範囲に絞ることができます。

参考コード:コレクションインタフェースで引数を受け取る例

// 読むだけでよい → IEnumerable<T>
void Show(IEnumerable<int> values)
{
    foreach (var v in values)
    {
        Console.WriteLine(v);
    }
}
 
// 追加・削除や件数が必要 → ICollection<T>
void AddValue(ICollection<int> values)
{
    values.Add(100);
    Console.WriteLine(values.Count);
}
 
// インデックスを指定してアクセスしたい → IList<T>
void Replace(IList<int> values)
{
    values[0] = 999;
}
 
// List<T>は3つのインタフェースをすべて実装しているので、
// どのメソッドにも渡すことができる
var list = new List<int> { 1, 2, 3 };
Show(list);
AddValue(list);
Replace(list);

 

IEnumerable<T>、ICollection<T>、IList<T>の違いがよくわからない方や、違いをうまく説明できないという方は、ぜひ本コースを通して確認してみてください。楽しんでいただける内容になっていると思います。

まとめ

本章では、コースの全体像を紹介しました。本コースでは、すべてのコレクションの土台である配列から始め、型を指定しない古いコレクションであるArrayList、.NET Framework 2.0から使える型安全なジェネリックコレクションであるList<T>へと時代をたどり、最後にIEnumerable<T>・ICollection<T>・IList<T>といったコレクションインタフェースの必要性と使い方を解説していきます。

C#文法:コレクション

■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る

A01_はじめに
A02_プロジェクトの作成
B01_配列とは
B02_配列の生成とアクセス
B03_生成と同時に値を設定する
B04_型推論による生成
B05_メソッドの引数などにする場合の注意点
B06_Length
B07_IndexOfでの検索
B08_FindIndexでの検索
B09_Find
B10_Exists
B11_FindAllとFindLast
B12_誤ったコピー
B13_Array.Copy
B14_範囲指定のコピー
B15_Resize
C01A_ArrayList
C02_List
C03_List 動的な要素の変更
C04_Listのコンストラクタ
C05_Listのコンストラクタ_Capacity
C06_ListTからArrayクラスのメソッドが呼ばれている
D01_コレクションインタフェースとは
D02_異なるコレクションクラスに互換性を持たせる
D03_インタフェースの階層構造
D04_クライアントができる操作を制限させる
D05_クライアントができる操作を制限させる_後半
D06_Enumerableの拡張メソッドに関して
D07_ReadOnly系のコレクションインタフェース
D08_AsReadOnly
D09_ToListでコピーする
D10_ListTはprivateで使う

■非公開コース「C#14新機能」プレゼント:
非公開コース「C#14新機能」(80分)をご覧になりたい方は
こちらからURLとパスワードを発行していますので、ご覧になってみてください。
非公開コース「C#14新機能」を観る