表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。
命名空间: System.Collections.Generic
程序集: mscorlib(在 mscorlib.dll 中)
<SerializableAttribute> _ Public Class List(Of T) _ Implements IList(Of T), ICollection(Of T), _ IEnumerable(Of T), IList, ICollection, IEnumerable
Dim instance As List(Of T)
[SerializableAttribute] public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
[SerializableAttribute] generic<typename T> public ref class List : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
J# 支持使用泛型 API,但是不支持新泛型 API 的声明。
JScript 不支持泛型类型或方法。
类型参数
-
T
-
列表中元素的类型。
List( T ) 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 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 ) 进行排序。
可使用一个整数索引访问此集合中的元素。此集合中的索引从零开始。
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)泛型接口以防止 BinarySearch 和 Sort 方法对列表元素进行装箱。如果您不拥有源代码,则将一个 IComparer(T) 对象传递给 BinarySearch 和 Sort 方法。
使用 List( T )类的特定于类型的实现,而不是使用 ArrayList 类或自己编写强类型包装集合,这样是很有好处的。原因是您的实现必须做 .NET Framework 已经为您完成的工作,并且公共语言运行时能够共享 Microsoft 中间语言代码和元素据,这是您的实现所无法做到的。
下面的代码示例演示 List( T )泛型类的几个属性和方法。该代码示例使用默认构造函数创建具有默认容量的字符串列表。随后显示 Capacity 属性,然后使用 Add 方法添加若干项。添加的项被列出, Capacity 属性会同 Count 属性一起再次显示,指示已根据需要增加了容量。
该示例使用 Contains 方法测试该列表中是否存在某个项,使用 Insert 方法在列表的中间插入一个新项,然后再次显示列表的内容。
默认的 Item 属性(C# 中的索引器)用于检索项, Remove 方法用于移除前面添加的重复项的第一个实例,然后,该示例再次显示内容。 Remove 方法总是移除它所遇到的第一个实例。
该示例使用 TrimExcess 方法减小容量以匹配计数,然后显示 Capacity 和 Count 属性。如果未用容量已经小于总容量的 10%,则列表容量不会进行调整。
最后,代码示例使用 Clear 方法移除列表中的所有项,并显示 Capacity 和 Count 属性。
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 */
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.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