Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
IEnumerable<T> / IList<T>
コレクションを抽象化する基底インターフェース『IEnumerable<T>』と『IList<T>』です。メソッドの引数や戻り値の型として使うことで、柔軟な設計が実現できます。
構文
// IEnumerable<T>: foreach でループできる最小限のインターフェースです。 IEnumerable<T> 変数 = new List<T>(); // IList<T>: インデックスアクセスと追加・削除ができるインターフェースです。 IList<T> 変数 = new List<T>(); // IReadOnlyList<T>: 読み取り専用のリストインターフェースです。 IReadOnlyList<T> 変数 = new List<T>();
インターフェース一覧
| インターフェース | 概要 |
|---|---|
| IEnumerable<T> | foreach でループする機能のみを持つ最も基本的なインターフェースです。LINQ の拡張メソッドが使えます。 |
| ICollection<T> | 要素数(Count)と追加・削除・含有チェックの機能を持ちます。 |
| IList<T> | ICollection に加え、インデックスによるアクセス([i])と挿入・削除をサポートします。 |
| IReadOnlyList<T> | 読み取り専用のリストです。Count とインデックスアクセスは使えますが、変更はできません。 |
| IReadOnlyCollection<T> | Count と foreach のみ使える読み取り専用コレクションです。 |
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;
// IEnumerable<T> を引数にすると、List・配列・HashSet など何でも受け取れます。
void 表示(IEnumerable<string> items)
{
foreach (string item in items) {
Console.Write(item + " ");
}
Console.WriteLine();
}
List<string> リスト = new List<string> { "C#", "Java", "Python" };
string[] 配列 = { "Go", "Rust", "Swift" };
HashSet<string> セット = new HashSet<string> { "Ruby", "PHP" };
表示(リスト); // C# Java Python
表示(配列); // Go Rust Swift
表示(セット); // Ruby PHP
// IList<T> ではインデックスアクセスも使えます。
IList<int> 数値リスト = new List<int> { 10, 20, 30 };
Console.WriteLine(数値リスト[1]); // 20
数値リスト.Add(40);
Console.WriteLine(数値リスト.Count); // 4
// IReadOnlyList<T> で外部からの変更を防ぎます。
IReadOnlyList<string> 読取専用 = new List<string> { "A", "B", "C" };
Console.WriteLine(読取専用[0]); // A
Console.WriteLine(読取専用.Count); // 3
// 読取専用.Add("D"); // コンパイルエラーになります。
// LINQ は IEnumerable<T> に対して使えます。
IEnumerable<int> 数列 = new int[] { 1, 2, 3, 4, 5 };
Console.WriteLine(数列.Where(x => x % 2 == 0).Sum()); // 6
概要
メソッドの引数型は、必要な機能に対して最も制約が緩いインターフェースを選ぶのがベストプラクティスです。ループするだけなら『IEnumerable<T>』を、インデックスアクセスが必要なら『IList<T>』を使います。
クラスの内部データを外部に公開する際には『IReadOnlyList<T>』が有効です。具体的な『List<T>』をそのまま公開すると外部からデータを書き換えられてしまいます。
重複なしのコレクションは『HashSet<T>』、Queue・Stack は『Queue<T> / Stack<T>』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。