.NET Framework 類別庫
List 泛型類別

注意:這個類別是 .NET Framework 2.0 版的新功能。

表示可以依照索引存取的強型別物件清單。提供搜尋、排序和管理清單的方法。

命名空間: System.Collections.Generic
組件: mscorlib (在 mscorlib.dll 中)

語法

Visual Basic (宣告)
<SerializableAttribute> _
Public Class List(Of T)
    Implements IList(Of T), ICollection(Of T), _
    IEnumerable(Of T), IList, ICollection, _
    IEnumerable
Visual Basic (使用方式)
Dim instance As List(Of T)
C#
[SerializableAttribute] 
public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable
C++
[SerializableAttribute] 
generic<typename T>
public ref class List : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable
J#
J# 可以支援使用泛型型別和方法,但不允許宣告新的泛型型別和方法。
JScript
JScript 並不支援泛型型別和方法。

型別參數

T

清單中元素的型別。

備註

List 類別是 ArrayList 類別的泛型對應項。它使用其大小會依所需動態增加的陣列,來實作 IList 泛型介面。

List 類別使用等號比較子和順序比較子。

  • ContainsIndexOfLastIndexOfRemove 之類方法對清單元素使用等號比較子。型別 T 之預設等號比較子的決定方式如下。如果型別 T 實作 IEquatable 泛型介面,則等號比較子為該介面的 Equals 方法,否則預設等號比較子為 Object.Equals(Object)

  • BinarySearchSort 之類方法對清單元素使用順序比較子。型別 T 之預設比較子的決定方式如下。如果型別 T 實作 IComparable 泛型介面,則預設比較子為該介面的 CompareTo 方法,如果型別 T 實作非泛型 IComparable 介面,則預設比較子為該介面的 CompareTo 方法。如果型別 T 不是實作以上兩者的介面,則沒有預設比較子,而且必須明確提供比較子或比較委派。

List 並不保證已經經過排序。執行需要 List 排序的作業 (例如 BinarySearch) 之前,一定要先排序 List

使用整數索引可以存取這個集合中的元素。這個集合中的索引以零起始。

List 接受 Null 參照 (即 Visual Basic 中的 Nothing) 做為參考型別的有效值,並允許重複的元素。

效能考量

決定要使用 ListArrayList 類別 (兩者有類似功能) 時,請記住,在大部分情況下,List 類別的執行效能較佳並且為型別安全。如果參考型別用於 List 類別的型別 T,這兩個類別的行為則是相同。然而,如果實值型別用於型別 T,您必須考慮實作和 boxing 問題。

如果實值型別用於型別 T,則編譯器會為該實值型別特別產生 List 類別的實作。這表示 List 物件的清單元素在使用前不需要 boxed,並且在建立約 500 個清單元素之後,因清單元素不需要進行 boxing 所節省的記憶體會大於用來產生類別實作的記憶體。

請確定,用於型別 T 的實值型別會實作 IEquatable 泛型介面。如果未實作,則 Contains 之類方法必須呼叫 Object.Equals(Object) 方法,它會 box 受影響的清單元素。如果實值型別實作 IComparable 介面,並且您擁有該原始程式碼,您也可以實作 IComparable 泛型介面,防止 BinarySearchSort 方法對清單元素執行 box。如果您未擁有該原始程式碼,請傳遞 IComparer 物件至 BinarySearchSort 方法。

比起使用 ArrayList 類別或自行寫入強型別包裝函式集合,使用 List 類別的型別特定實作更具優勢。原因是,您的實作必須執行 .NET Framework 已提供的工作,而且 Common Language Runtime 可以共用 Microsoft Intermediate Language 程式碼和中繼資料,但您的實作則無法共用。

範例

下列程式碼範例中,示範 List 泛型類別的多個屬性和方法。預設建構函式會用於建立 0 容量的字串清單。Capacity 屬性會顯示,然後使用 Add 方法來加入多個項目。項目隨即列出,然後 Capacity 屬性隨著 Count 屬性會再次顯示,表示容量已經根據需要而增加。

Contains 方法會用來測試清單項目的存在,Insert 方法則用來將新項目插入至清單中間,並且清單內容會再次顯示。

預設 Item 屬性 (在 C# 中為索引子) 會用來擷取項目,Remove 方法會用來移除先前加入之重複項目的第一個執行個體,並且內容會再次顯示。Remove 方法永遠會移除它遇到的第一個執行個體。

TrimExcess 方法會用來減少容量以符合計數,並且 CapacityCount 屬性會顯示。如果未使用的容量已經小於總容量的 10%,則清單不會調整大小。

最後,Clear 方法會用來從清單移除所有項目,並且 CapacityCount 屬性會顯示。

Visual Basic
Imports System
Imports System.Collections.Generic

Public Class Example

    Public Shared Sub Main()

        Dim dinosaurs As New List(Of String)

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)

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

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _
            dinosaurs.Contains("Deinonychus"))

        Console.WriteLine(vbLf & "Insert(2, ""Compsognathus"")")
        dinosaurs.Insert(2, "Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        Console.WriteLine(vbLf & "dinosaurs(3): {0}", dinosaurs(3))

        Console.WriteLine(vbLf & "Remove(""Compsognathus"")")
        dinosaurs.Remove("Compsognathus")

        Console.WriteLine()
        For Each dinosaur As String In dinosaurs
            Console.WriteLine(dinosaur)
        Next

        dinosaurs.TrimExcess()
        Console.WriteLine(vbLf & "TrimExcess()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)

        dinosaurs.Clear()
        Console.WriteLine(vbLf & "Clear()")
        Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
        Console.WriteLine("Count: {0}", dinosaurs.Count)
    End Sub
End Class

' 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
C#
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
 */
C++
using namespace System;
using namespace System::Collections::Generic;

void main()
{
    List<String^>^ dinosaurs = gcnew 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();
    for each(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();
    for each(String^ dinosaur in dinosaurs )
    {
        Console::WriteLine(dinosaur);
    }

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

    Console::WriteLine("\nRemove(\"Compsognathus\")");
    dinosaurs->Remove("Compsognathus");

    Console::WriteLine();
    for each(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
執行緒安全

這個型別的公用靜態 (在 Visual Basic 中為 Shared) 成員是安全執行緒。不保證任何執行個體成員是安全執行緒。

只要未修改集合,List 可同時支援多個讀取器 (Reader)。透過集合進行列舉在本質上並非是安全執行緒程序。在列舉型別競用一或多個寫入權限的極少數案例中,確保執行緒安全的唯一方式是在整個列舉期間鎖定集合。若要讓多重執行緒能夠存取集合以便進行讀取和寫入,您必須實作自己的同步處理。

平台

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
請參閱

標記 :


Page view tracker