C#中List(Of T)类

Posted 一苇渡江694

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中List(Of T)类相关的知识,希望对你有一定的参考价值。

.Net Framework为动态列表提供了泛型类List ,这个类实现了IList、ICollection、IEnumerable、IList 、ICollection 、IEnumerable 接口。

ICollection 接口:

ICollection 接口由泛型集合类实现。使用这个接口可以获得集合中的元素个数(count属性),把集合复制到数组中(copyto()方法),还可以从集合中添加和删除元素(Add(),Remove(),Clear())。

IEnumerable 接口:

如果将foreach语句用于集合,就需要IEnumerable接口。这个接口定义了方法GetEnumerator(),它返回一个实现了IEnumerator接口的枚举。

List(Of T)类

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

命名空间:System.Collections.Generic

程序集:mscorlib(在mscorlib.dll中)

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

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

(3)List(Of T)不保证是排序的。

(4)List(Of T)接受Nothing作为引用类型的有效值并且允许有重复的元素。

构造函数:

List(Of T) 初始化List(Of T)类的新实例,该实例为空并且具有默认初始容量。

List(Of T)(IEnumerable(Of T)) 初始化List(Of T)类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素

List(Of T)(Of T)(Int32) 初始化List(Of T)类的新实例,该实例为空并且具有指定的初始容量。

1.创建列表

var intList = new List();

var races = new List();//其中Racer为一个类

List intList = new List(10);

intList.Capacity = 20;

容量与集合中元素的个数不同。如果已经将元素添加到列表中,且不希望添加更多的元素,可以使用TrimExcess()方法去除不需要的容量。需要注意的是如果元素个数超过了容量的90%,TrimExcess()方法就什么也不做。

2.结合初始值设定项

var intList = new List()1, 2;

var stringList = new List()"one", "two";

3.添加元素

3.1 List .Add方法

语法:public void Add(T item)

该函数的返回类型为void,参数为T。

注意与ArrayList.Add的区别:ArrayList.Add的参数为Object类型,所以涉及到装箱的问题。

3.2 List .AddRange方法

语法:public void AddRange(IEnumerable collection)

4.插入元素

4.1 List .Insert方法

语法:public void Insert(int index, T item);

4.2 List .InsertRange方法

语法:public void InsertRange(int index, IEnumerable collection)

5.访问元素

5.1 使用索引器访问

Racer r1 = racers[3];

5.2 使用foreach遍历集合

foreach(Racer r in racers)

Console.WriteLine(r);

5.3 ForEach()方法

对List的每个元素执行指定操作,要对List的每个元素执行Action委托。

语法:public void ForEach(Action action)

static void Main()

List names = new List();

names.Add("Bruce");

names.Add("Alfred");

names.Add("Tim");

names.Add("Richard");

// Display the contents of the list using the Print method.

names.ForEach(Print);

// The following demonstrates the anonymous method feature of C#

// to display the contents of the list to the console.

names.ForEach(delegate(String name)

Console.WriteLine(name);

);

private static void Print(string s)

Console.WriteLine(s);

6.删除元素

可以利用索引,也可以传递要删除的元素。

7.搜索

可以使用IndexOf、LastIndexOf等。

8.排序

同样使用快速排序。

9.性能注意事项 

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

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

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

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

************************************************************************************************

数组、ArrayList、List区别及使用:

    数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List的容量可根据需要自动扩充、修改、删除或插入数据。

    数组可以具有多个维度,而 ArrayList或 List< T> 始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于 ArrayList的性能。 这是因为 ArrayList的元素属于 Object 类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List< T> 的性能与同类型的数组十分相近。

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

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

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

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

************************************************************************************************


以上是关于C#中List(Of T)类的主要内容,如果未能解决你的问题,请参考以下文章

C#中List<T>的作用与用法,求详解 谢谢

如何创建一个 List(of T),其中 T 是 (T) 的接口,并且 List 的内容继承了实现 T 接口的 Abstract 类

C#怎样定义返回值为List的方法

在索引处的 List<T> 中添加值的 C# 方法

编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值

C# 将Object类转化为List<T>类,其中T的类型不是object类型。