List( T ) 类

List( T ) 类

 

表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。

命名空间:   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
Visual C++
[SerializableAttribute]
generic<typename T>
public ref class List : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable
J#
J# 支持使用泛型 API,但是不支持新泛型 API 的声明。
JScript
JScript 不支持泛型类型或方法。
类型参数
T

列表中元素的类型。

List( T ) 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 List( T )泛型接口。

List( T ) 类既使用相等比较器又使用排序比较器。

  • 诸如 Contains IndexOf LastIndexOfRemove 这样的方法对列表元素使用相等比较器。类型 T 的默认相等比较器按如下方式确定。如果类型 T 实现 IEquatable( T )泛型接口,则相等比较器为该接口的 Equals(T) 方法;否则,默认相等比较器为 Object..::.Equals(Object)

  • 诸如 BinarySearchSort 这样的方法对列表元素使用排序比较器。类型 T 的默认比较器按如下方式确定。如果类型 T 实现 IComparable(T) 泛型接口,则默认比较器为该接口的 CompareTo(T) 方法;否则,如果类型 T 实现非泛型 IComparable 接口,则默认比较器为该接口的 CompareTo(Object) 方法。如果类型 T 没有实现其中任一个接口,则不存在默认比较器,并且必须显式提供比较器或比较委托。

List( T ) 不保证是排序的。在执行要求List( T ) 已排序的操作(例如 BinarySearch)之前,您必须对 List( T ) 进行排序。

可使用一个整数索引访问此集合中的元素。此集合中的索引从零开始。

List( T )接受 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing 作为引用类型的有效值并且允许有重复的元素。

性能注意事项

在决定使用 List( T )还是使用 ArrayList 类(两者具有类似的功能)时,记住List( T )类在大多数情况下执行得更好并且是类型安全的。如果对 List( T )类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。

如果对类型 T 使用值类型,则编译器将特别针对该值类型生成List( T )类的实现。这意味着不必对 List( T )对象的列表元素进行装箱就可以使用该元素,并且在创建大约 500 个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。

确保用于类型 T 的值类型实现 IEquatable(T) 泛型接口。如果未实现,则诸如 Contains 这样的方法必须调用 Object..::.Equals(Object) 方法,后者对受影响的列表元素进行装箱。如果值类型实现 IComparable 接口,并且您拥有源代码,则还应实现 IComparable(T)泛型接口以防止 BinarySearchSort 方法对列表元素进行装箱。如果您不拥有源代码,则将一个 IComparer(T) 对象传递给 BinarySearchSort 方法。

使用 List( T )类的特定于类型的实现,而不是使用 ArrayList 类或自己编写强类型包装集合,这样是很有好处的。原因是您的实现必须做 .NET Framework 已经为您完成的工作,并且公共语言运行时能够共享 Microsoft 中间语言代码和元素据,这是您的实现所无法做到的。

下面的代码示例演示 List( T )泛型类的几个属性和方法。该代码示例使用默认构造函数创建具有默认容量的字符串列表。随后显示 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
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
 */
Visual 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(T)
    System.ServiceModel.Install.Configuration . . :: .ServiceModelConfigurationSectionCollection
    System.ServiceModel.Install.Configuration . . :: .ServiceModelConfigurationSectionGroupCollection
    System.Workflow.Activities . . :: .OperationParameterInfoCollection
    System.Workflow.Activities . . :: .WorkflowRoleCollection
    System.Workflow.ComponentModel . . :: .ActivityCollection
    System.Workflow.ComponentModel.Design . . :: .ActivityDesignerGlyphCollection
    System.Workflow.Runtime.Tracking . . :: .ActivityTrackingLocationCollection
    System.Workflow.Runtime.Tracking . . :: .ActivityTrackPointCollection
    System.Workflow.Runtime.Tracking . . :: .ExtractCollection
    System.Workflow.Runtime.Tracking . . :: .TrackingAnnotationCollection
    System.Workflow.Runtime.Tracking . . :: .TrackingConditionCollection
    System.Workflow.Runtime.Tracking . . :: .UserTrackingLocationCollection
    System.Workflow.Runtime.Tracking . . :: .UserTrackPointCollection
    System.Workflow.Runtime.Tracking . . :: .WorkflowTrackPointCollection

此类型的公共静态(在 Visual Basic 中为 Shared)成员是线程安全的。但不能保证任何实例成员是线程安全的。

只要不修改该集合,List( T )就可以同时支持多个阅读器。从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。在枚举与一个或多个写访问竞争的罕见情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值