このドキュメントはアーカイブされており、メンテナンスされていません。

List ジェネリック クラス

メモ : このクラスは、.NET Framework version 2.0 で新しく追加されたものです。

インデックスを使用してアクセスできる、厳密に型指定されたオブジェクトのリストを表します。リストの検索、並べ替え、および操作のためのメソッドを提供します。

名前空間: System.Collections.Generic
アセンブリ: mscorlib (mscorlib.dll 内)

[SerializableAttribute] 
public class List<T> : IList<T>, ICollection<T>, 
	IEnumerable<T>, IList, ICollection, IEnumerable
J# では、ジェネリックな型およびメソッドは使用できますが、新規に宣言することはできません。
JScript では、ジェネリックな型およびメソッドは使用できません。

型パラメータ

T

リスト内の要素の型。

List クラスは、ArrayList クラスとジェネリックに等価です。このクラスは、必要に応じてサイズが動的に増加する配列を使用して、IList ジェネリック インターフェイスを実装します。

List クラスは、等値比較演算子と順序比較演算子の両方を使用します。

  • ContainsIndexOfLastIndexOfRemove などのメソッドは、リスト要素の等値比較演算子を使用します。型 T の既定の等値比較演算子は、次のように決定されます。型 TIEquatable ジェネリック インターフェイスを実装している場合、等値比較演算子はそのインターフェイスの Equals メソッドです。それ以外の場合、既定の等値比較演算子は Object.Equals(Object) です。

  • BinarySearchSort などのメソッドは、リスト要素の順序比較演算子を使用します。型 T の既定の比較演算子は、次のように決定されます。型 TIComparable ジェネリック インターフェイスを実装している場合、既定の比較演算子はそのインターフェイスの CompareTo メソッドです。それ以外で、型 T が非ジェネリックの IComparable インターフェイスを実装している場合、既定の比較演算子はそのインターフェイスの CompareTo メソッドです。型 T がどちらのインターフェイスも実装していない場合、既定の比較演算子は存在せず、比較演算子または比較デリゲートを明示的に指定する必要があります。

List が並べ替えられることは保証されていません。List を並べ替える必要のある操作 (BinarySearch など) を実行する前に、List を並べ替える必要があります。

このコレクション内の要素は、整数インデックスを使用してアクセスできます。このコレクションのインデックスは 0 から始まります。

List は、null 参照 (Visual Basic では Nothing) を参照型に対して有効な値として受け取り、要素の重複を許可します。

パフォーマンスに関する考慮事項

List クラスまたは ArrayList クラスのどちらを使用するかを決定する場合、両者の機能は類似していますが、List クラスは通常パフォーマンスが優れており、タイプ セーフであることも考慮してください。List クラスの型 T で参照型が使用される場合、2 つのクラスの動作は同じです。ただし、型 T で値型が使用される場合、実装とボックス化の実行を検討する必要があります。

T で値型が使用される場合、コンパイラはその値型のために List クラスの実装を生成します。つまり、List オブジェクトのリスト要素は、その要素が使用できるまでボックス化する必要はありません。約 500 のリスト要素が作成されると、ボックス化しないリスト要素が保存されたメモリは、そのクラス実装を生成するために使用されたメモリよりも大きくなります。

T で使用される値型が、IEquatable ジェネリック インターフェイスを実装していることを確認します。実装していない場合、Contains などのメソッドは、影響を受けるリスト要素をボックス化する Object.Equals(Object) メソッドを呼び出す必要があります。値型が IComparable インターフェイスを実装している場合、ソース コードを所有していれば、IComparable ジェネリック インターフェイスも実装して BinarySearch メソッドと Sort メソッドがリスト要素をボックス化しないようにします。ソース コードを所有していない場合は、IComparer オブジェクトを BinarySearch メソッドと Sort メソッドに渡します。

ArrayList クラスを使用したり、厳密に型指定されたラッパーのコレクションを独自に記述したりする代わりに、List クラスの型固有の実装を使用することには利点があります。その理由は、独自の実装では、既に .NET Framework が行っている動作を実行する必要があることです。また、共通言語ランタイムは MSIL (Microsoft Intermediate Language) コードとメタデータを共有できますが、独自の実装ではできないことも理由です。

List ジェネリック クラスのいくつかのプロパティおよびメソッドを使用したコード例を次に示します。既定のコンストラクタを使用して、容量が 0 の文字列のリストを作成します。Capacity プロパティが表示された後、Add メソッドを使用して複数の項目を追加します。項目がリストされ、Capacity プロパティが Count プロパティと共に再表示されて、必要に応じて容量が増加したことが示されます。

Contains メソッドを使用して、リストに項目が存在するかをテストし、Insert メソッドを使用して、リストの中間に新しい項目を挿入します。リストの内容が再表示されます。

既定の Item プロパティ (C# ではインデクサ) を使用して項目を取得し、Remove メソッドを使用して、以前に追加された重複している項目の最初のインスタンスを削除します。内容が再表示されます。Remove メソッドは、常に、見つかった最初のインスタンスを削除します。

TrimExcess メソッドを使用して、項目数と一致するように容量を削減します。Capacity プロパティと Count プロパティが表示されます。未使用の容量が全容量の 10% 未満であった場合、リストのサイズは変更されていません。

最後に、Clear メソッドを使用して、リストからすべての項目を削除し、Capacity プロパティと Count プロパティが表示されます。

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);

        dinosaurs.Add("Tyrannosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");
        dinosaurs.Add("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
            dinosaurs.Contains("Deinonychus"));

        Console.WriteLine("\nInsert(2, \"Compsognathus\")");
        dinosaurs.Insert(2, "Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

        Console.WriteLine("\nRemove(\"Compsognathus\")");
        dinosaurs.Remove("Compsognathus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        dinosaurs.TrimExcess();
        Console.WriteLine("\nTrimExcess()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);

        dinosaurs.Clear();
        Console.WriteLine("\nClear()");
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
        Console.WriteLine("Count: {0}", dinosaurs.Count);
    }
}

/* This code example produces the following output:

Capacity: 0

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

Capacity: 8
Count: 5

Contains("Deinonychus"): True

Insert(2, "Compsognathus")

Tyrannosaurus
Amargasaurus
Compsognathus
Mamenchisaurus
Deinonychus
Compsognathus

dinosaurs[3]: Mamenchisaurus

Remove("Compsognathus")

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

TrimExcess()
Capacity: 5
Count: 5

Clear()
Capacity: 5
Count: 0
 */

System.Object
  System.Collections.Generic.List

この型の public static (Visual Basic では Shared) メンバは、スレッド セーフです。すべてのインスタンス メンバがスレッド セーフになるかどうかは保証されていません。

コレクションが変更されない限り、List では、複数の読み込み操作が同時に発生しても問題ありません。コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。まれに 1 つ以上の書き込みアクセスによって列挙処理で競合が発生する場合、確実にスレッド セーフにするには、列挙処理が完了するまでコレクションをロックします。コレクションに対し複数のスレッドがアクセスして読み取りや書き込みを行うことができるようにするには、独自に同期化を実装する必要があります。

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。

.NET Framework

サポート対象 : 2.0

.NET Compact Framework

サポート対象 : 2.0
表示: