Home > C# > C# 学び直し > List<T>クラス

翻訳した、msdnのList<T>クラスの説明

新規作成日 2017-10-20
最終更新日

確認した時点では、msdnのList<T>クラスの説明は、翻訳が読みにくいので、自分で翻訳し直しました。

全ての部分を翻訳し直したわけではないので、元のページと比較しながらご利用下さい。

msdnのList<T>クラスの説明

List<T>クラス

インデックスでアクセスすることができる、オブジェクトの厳密に型指定されたリストを表します。 リストを検索、並び替え、そして、操作するためのメソッドを提供します。 この型の.NET Frameworkソースコードを参照するには、Reference Sourceを参照してください。

メモ

この型の.NET Frameworkソースコードを表示するには、Reference Sourceを参照してください。

あなたは、ソースコードをオンラインで閲覧でき、オフラインで表示するために、リファレンスをダウンロードできます。 そして、デバッグの間、(パッチと更新が含まれる)ソースをステップ実行することができます。;説明文を参照してください。

List<T>クラスは、ジェネリックのArrayListクラスと同等です。それは、必要に応じて大きさを動的に増やす配列を使用して、List<T>ジェネリック・インターフェイスを実装しています。

あなたは、AddやAddRangeメソッドを使用して、List<T>に項目を追加することができます。

List<T>クラスは、等価比較演算子と並べ替え演算子の両方を使用しています。

  • Contains、IndexOf、LastIndexOfとRemoveのようなメソッドは、リスト要素に等価比較演算子を使用します。 T型のための既定の等価比較演算子は、次のように決定されています。T型が、IEquatable<T>ジェネリック・インターフェイスを実装する場合、 続いて、等価比較演算子は、そのインターフェイスのEquals(T)メソッドです。;それ以外の場合には、既定の等価比較演算子は、Object.Equals(Object)です。
  • BinarySearchとSortのようなメソッドは、リスト要素のために、並び替え演算子を使用します。 T型のための既定の比較演算子は、次のように決定されています。T型が、IComparable<T>ジェネリック・インターフェイスを実装する場合、 続いて、既定の比較演算子は、そのインターフェイスのCompareTo(T)メソッドです。; それ以外の場合には、T型が、非ジェネリックのIComparableインターフェースを実装する場合、 それゆえ、既定の比較演算子は、そのインターフェイスのCompareTo(Object)メソッドです。;T型が、どちらのインターフェイスも実装していない場合、続いて、既定の比較演算子を持っていません。 そして、比較演算子や比較デリゲートは、明示的に提供されている必要があります。

List<T>は、並べ替えられているとは、保証されません。 あなたは、並べ替えるために、List<T>を必要とする(BinarySearchのような)操作を実行する前に、List<T>を並び替える必要があります。

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

極めて大きなList<T>オブジェクトでは、あなたは、設定要素の使用可能属性を、実行時の環境で、trueに設定することで、64-bitシステムで、最大容量を20億個の要素に増やすことができます。

List <T>は、参照型の有効な値としてnullを受け取り、重複する要素を提供します。

List<T>クラスの不変バージョンのために、ImmutableList<T>を参照してください。

性能上の注意事項

Performance Considerations

その両方には、類似している機能がある、List<T>やArrayListクラスを使うべきかとどうか決定するには、List <T>クラスが、 ほとんどの場合、より優れたパフォーマンスを発揮し、安全な型であることを覚えておいて下さい。 List <T>クラスのT型に参照型が使用されている場合、2つのクラスの動作は、同一です。 しかしながら、T型に値型が使用されている場合、あなたは、実装とボクシング問題について考える必要があります。

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

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

ArrayListクラスを使うか、あなた自身で、厳密に型指定されたラッパ・コレクションを記述する代わりに、List<T>クラスの型固有の実装を使うことは、あなたにとって有利です。 理由は、あなたの実装が、あなたが既に.NET Frameworkで行っていることをする必要があるためです。 そして、共通言語ランタイムは、あなたの実装が、行うことができない、Microsoft中間言語コードとメタデータを共有することができます。

使用例01

以下の例は、List<T>内の簡単なビジネス・オブジェクトをどのように、追加、削除、そして、挿入するかを説明します。

using System;
using System.Collections.Generic;

// Simple business object. A PartId is used to identify the type of part 
// but the part name can change. 
// 簡単なビジネス・オブジェクト。
// PartIdは、部品の種類を識別するために使用されますが、部品の名前は、変更することができます。
public class Part : IEquatable<Part>
{
    public string PartName { get; set; }

    public int PartId { get; set; }

    public override string ToString()
    {
        return "ID: " + PartId + "   Name: " + PartName;
    }
    public override bool Equals(object obj)
    {
        if (obj == null) return false;
        Part objAsPart = obj as Part;
        if (objAsPart == null) return false;
        else return Equals(objAsPart);
    }
    public override int GetHashCode()
    {
        return PartId;
    }
    public bool Equals(Part other)
    {
        if (other == null) return false;
        return (this.PartId.Equals(other.PartId));
    }
    // Should also override == and != operators.
    // また、==と!=演算子をオーバーライドする必要があります。

}
public class Example
{
    public static void Main()
    {
        // Create a list of parts.
        // 部品のリストを作成します。
        List<Part> parts = new List<Part>();

        // Add parts to the list.
        // リストに、部品を追加します。
        parts.Add(new Part() { PartName = "crank arm", PartId = 1234 });
        parts.Add(new Part() { PartName = "chain ring", PartId = 1334 });
        parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
        parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
        parts.Add(new Part() { PartName = "cassette", PartId = 1534 });
        parts.Add(new Part() { PartName = "shift lever", PartId = 1634 });

        // Write out the parts in the list. This will call the overridden ToString method
        // in the Part class.
        // リスト内の部品を書き出します。
        // これは、PartクラスでオーバーライドされたToStringメソッドを呼び出します。
        Console.WriteLine();
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }


        // Check the list for part #1734. This calls the IEquitable.Equals method
        // of the Part class, which checks the PartId for equality.
        // 部品#1734のためのリストを確認します。これは、同等かどうかPartIdを確認する、
        // PartクラスのIEquitable.Equalsメソッドを呼び出します。
        Console.WriteLine("\nContains(\"1734\"): {0}",
        parts.Contains(new Part { PartId = 1734, PartName = "" }));

        // Insert a new item at position 2.
        // 位置2に、新しい項目を挿入します。
        Console.WriteLine("\nInsert(2, \"1834\")");
        parts.Insert(2, new Part() { PartName = "brake lever", PartId = 1834 });


        // Console.WriteLine();
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }

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

        Console.WriteLine("\nRemove(\"1534\")");

        // This will remove part 1534 even though the PartName is different,
        // because the Equals method only checks PartId for equality.
        // Equalsメソッドは、PartIdが、同等かどうかだけを確認するため、
        // PartNameが異なっているかに関係なく、部品1534を削除します。
        parts.Remove(new Part() { PartId = 1534, PartName = "cogs" });

        Console.WriteLine();
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }
        Console.WriteLine("\nRemoveAt(3)");
        // This will remove the part at index 3.
        // これは、index 3で部品を削除します。
        parts.RemoveAt(3);

        Console.WriteLine();
        foreach (Part aPart in parts)
        {
            Console.WriteLine(aPart);
        }

        // Keep the console window open in debug mode.
        // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}

実行結果

実行例01 実行結果

実行例02

以下の例は、文字列型のList<T>ジェネリック・クラスのいくつかのプロパティとメソッドを説明します。(複合型のList<T>の例については、Containsメソッドを参照してください)

既定のコンストラクタは、既定の能力で文字列のリストを作成するために、使用されます。

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);
        }

        // Shows accessing the list using the Item property.
        // Itemプロパティを使用して、リストへのアクセスを表示します。
        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);

        // Keep the console window open in debug mode.
        // デバッグモードで、コンソール・ウインドウを開いた状態に維持します。
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}

実行例02 実行結果

実行例02 実行結果

スレッド セーフ

どのインスタンス・メンバーでも、スレッド・セーフであるとは限りませんが、この型のpublic static(Visual BasicではShared)メンバーは、スレッド・セーフです。

List<T>で複数の読み込みを実行することは安全です。しかし、読み込まれている間に、コレクションが、修正される場合、問題が、発生することがあります。 スレッドの安全性を保証するために、読込みや書込み操作の間、コレクションを固定します。読み書きするための複数のスレッドで、コレクションへのアクセスを有効にするには、あなたは、あなた独自の同期を実装する必要があります。 組み込まれている同期を使用するコレクションのために、System.Collections.Concurrent名前空間のクラスを参照してください。 本質的にスレッドセーフな代替のために、ImmutableList<T>クラスを参照してください。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」