C#泛型List的用法
来源:C#学习 发布时间:2014/1/4
一、List<T>命名空间:
System.Collections.Generic(程序集:mscorlib)
二、List<T>描述:
1)、表示可通过索引访问的对象的强类型列表;提供用于对列表进行搜索、排序和操作的方法。
2)、是ArrayList类的泛型等效类。
3)、可以使用一个整数索引访问此集合中的元素;索引从 零 开始。
4)、可以接收null空引用(VB中的Nothing)。
5)、允许重复元素
三、List<T>构造函数
名称 | 说明 |
List<T>() | 初始化 List<T> 类的新实例,该实例为空并且具有默认初始容量(0)。 |
List<T>(IEnumerable<T>) | 初始化 List<T> 类的新实例,该实例包含从指定集合复制的元素并且具有足够的容量来容纳所复制的元素。 |
List<T>(Int32) | 始化 List<T> 类的新实例,该实例为空并且具有指定的初始容量。 |
说明:默认向 List<T> 添加元素时,将通过重新分配内部数组,根据需要自动增大容量。如果可以估计集合的大小,那么当指定初始容量后,将无需在向 List<T> 中添加元素时执行大量的大小调整操作。这样可提高性能。
四、List<T>属性
名称 | 说明 |
Capacity | 获取或设置该内部数据结构在不调整大小的情况下能够容纳的元素总数。 |
Count | 获取 List<T> 中实际包含的元素数。 |
说明:Capacity 是 List<T> 在需要调整大小之前可以存储的元素数,Count 则是 List<T> 中实际存储的元素数。
五、List<T>方法
名称 | 说明 |
Add | 将对象添加到 List<T> 的结尾处。 |
AddRange | 将指定集合的元素添加到 List<T> 的末尾。 |
AsReadOnly | 返回当前集合的只读 IList<T> 包装。 |
BinarySearch(T) | 使用默认的比较器在整个已排序的 List<T> 中搜索元素,并返回该元素从零开始的索引。 |
BinarySearch(T, IComparer<T>) | 使用指定的比较器在整个已排序的 List<T> 中搜索元素,并返回该元素从零开始的索引。 |
BinarySearch(Int32, Int32, T, IComparer<T>) | 使用指定的比较器在已排序 List<T> 的某个元素范围中搜索元素,并返回该元素从零开始的索引。 |
Clear | 从 List<T> 中移除所有元素。 |
Contains | 确定某元素是否在 List<T> 中。 |
ConvertAll<TOutput> | 将当前 List<T> 中的元素转换为另一种类型,并返回包含转换后的元素的列表。 |
CopyTo(T[]) | 将整个 List<T> 复制到兼容的一维数组中,从目标数组的开头开始放置。 |
Exists | 确定 List<T> 是否包含与指定谓词所定义的条件相匹配的元素。 |
Find | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配元素。 |
FindIndex(Predicate<T>) | 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中第一个匹配元素的从零开始的索引。 |
ForEach | 对 List<T> 的每个元素执行指定操作。 |
GetEnumerator | 返回循环访问 List<T> 的枚举器。 |
IndexOf(T) | 搜索指定的对象,并返回整个 List<T> 中第一个匹配项的从零开始的索引。 |
Insert | 将元素插入 List<T> 的指定索引处。 |
InsertRange | 将集合中的某个元素插入 List<T> 的指定索引处。 |
LastIndexOf(T) | 搜索指定的对象,并返回整个 List<T> 中最后一个匹配项的从零开始的索引。 |
Remove | 从 List<T> 中移除特定对象的第一个匹配项。 |
Reverse() | 将整个 List<T> 中元素的顺序反转。 |
Sort() | 使用默认比较器对整个 List<T> 中的元素进行排序。 |
TrimExcess | 将容量设置为 List<T> 中的实际元素数目(如果该数目小于某个阈值)。 |
TrueForAll | 确定是否 List<T> 中的每个元素都与指定的谓词所定义的条件相匹配。 |
说明:上述方法说明中有用到“谓词”,谓词就是Predicate<T> 委托,它代表一组方法,该方法定义一组条件,并确定指定的参数对象是否符合这些条件,具体的参见示例程序。
六、常用方法实例
(1)创建及初始化:
List<string> myList = new List<string>();//初始Capacity为 零
List<string> myList2 = new List<string>(30); //初始Capacity为 30
List<string> myList3 = new List<string>(new string[] { "1", "a", "2", "b" });//初始Capacity 为 4,并且元素已被复制
(2)添加一个元素 List.Add(T item)
mlist.Add("d");
(3)添加集合元素
string[] Arr2 ={"f","g"."h"};
mlist.AddRange(Arr2);
(4)在index位置添加一个元素 Insert(int index,T item)
mlist.Insert(1,"p");
(5)遍历List中元素
foreach(T element in mlist) T的类型与mlist声明时一样
{
Console.WriteLine(element);
}
(6)删除元素
List.Remove(T item) 删除一个值
mlist.Remove("a");
List.RemoveAt(int index);删除下标为index的元素
mlist.RemoveAt(0);
List.RemoveRange(int index,int count); 下标index开始,删除count个元素
mlist.RemoveRange(3,2);
////用法举例
List<int> list = new List<int>() { 2, 3, 6, 9, 11, 23, 89 };
int temp = 0;
for (int i = 0; i < list.Count; i++)
{
if (list[i] == 9)
{
temp = i;
}
}
list.RemoveRange(0,temp);
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.ReadKey();
(7)判断某个元素是否在该List中
List.Contains(T item) 返回true或false
if(mlist.Contains"("g"))
Console.WriteLine("g存在列表中");
else
mlist.Add("g");
(8)给List里面元素排序 List.Sort() 默认是元素每一个字母按升序
mlist.Sort();
(9)给List里面元素顺序反转 List.Reverse() 可以与List.Sort()配合使用
(10)List清空 List.Clear()
mlist.Clear();
(11)Capacity与Count
1)、Capacity在需要调整大小之前可存储的元素数;Count实际存储的元素数。
2)、Capacity总是大于或者等于Count
七、List<T>的注意事项
1、 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 没有实现其中任一个接口,则不存在默认比较器,并且必须显式提供比较器或比较委托。
2、 List<T> 不保证是排序的。在执行要求 List<T> 已排序的操作(例如 BinarySearch)之前,您必须对 List<T> 进行排序。
3、 List<T> 不保证是排序的。在执行要求 List<T> 已排序的操作(例如 BinarySearch)之前,您必须对 List<T> 进行排序。
4、 使用整数索引可以访问此集合中的元素。此集合中的索引从零开始。
5、 List<T> 接受 null 作为引用类型的有效值并且允许有重复的元素。
6、 大多数情况下List<T>执行得更好并且是类型安全的,可以替换ArrayList,但是如果对类型 T 使用值类型,则编译器将特别针对该值类型生成 List<T> 类的实现。这意味着不必对 List<T> 对象的列表元素进行装箱就可以使用该元素,并且在创建大约 500 个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。如果创建小于500个元素,建议使用ArrayList.