List <T>是强类型对象的集合,可以通过索引对其进行访问,并具有用于排序,搜索和修改列表的方法。 它是System.Collection.Generic命名空间下的ArrayList的泛型版本。
List<T> 等效于ArrayList,它实现了IList <T>。
它在System.Collection.Generic命名空间下。
List<T>可以包含指定类型的元素。它提供编译时类型检查,并且不执行装箱/拆箱,因为它是泛型的。
可以使用Add(),AddRange()方法或collection-initializer(集合初始化器)语法添加元素。
可以通过传递索引来访问元素,例如myList[0]。索引从零开始。
List<T>与ArrayList相比,执行速度更快,出错更少。
List<T>是一个泛型集合,所以你需要指定它可以存储的数据类型的类型参数。以下示例显示了如何创建列表和添加元素。
List<int> primeNumbers = new List<int>(); primeNumbers.Add(1); // 使用add()方法添加元素 primeNumbers.Add(3); primeNumbers.Add(5); primeNumbers.Add(7); var cities = new List<string>(); cities.Add("New York"); cities.Add("London"); cities.Add("Mumbai"); cities.Add("Chicago"); cities.Add(null);// 引用类型列表允许为null //使用collection-initializer语法添加元素 var bigCities = new List<string>() { "New York", "London", "Mumbai", "Chicago" };
在上面的示例中,
List<int> primeNumbers = new List<int>();
创建int类型的列表。同样,cities 和 bigcity是字符串类型的 List。然后可以使用add()方法或集合初始值设定项语法在列表中添加元素。
还可以使用集合初始化器(collection-initializer)语法添加自定义类的元素。下面示例在 List < Student > 中添加 Student 类的对象。
var students = new List<Student>() { new Student(){ Id = 1, Name="Bill"}, new Student(){ Id = 2, Name="Steve"}, new Student(){ Id = 3, Name="Ram"}, new Student(){ Id = 4, Name="Abdul"} };
使用AddRange()方法将数组或另一个集合中的所有元素添加到List。
AddRange() 签名:
void AddRange(IEnumerable<T> collection)
string[] cities = new string[3]{ "Mumbai", "London", "New York" }; var popularCities = new List<string>(); // 在列表中添加数组 popularCities.AddRange(cities); var favouriteCities = new List<string>(); // 添加列表 favouriteCities.AddRange(popularCities);
可以通过索引、 for/foreach 循环和使用 LINQ 查询访问列表。列表的索引从零开始。传递方括号中的索引以访问单个列表项,与数组相同。使用 foreach 或 for 循环迭代 List <T> 集合。
List<int> numbers = new List<int>() { 1, 2, 5, 7, 8, 10 }; Console.WriteLine(numbers[0]); // 版画1 Console.WriteLine(numbers[1]); // 版画2 Console.WriteLine(numbers[2]); // 版画5 Console.WriteLine(numbers[3]); // 版画7 // 使用foreach LINQ方法 numbers.ForEach(num => Console.WriteLine(num + ", "));//打印1,2,5,7,8,10, // 使用for循环 for(int i = 0; i < numbers.Count; i++) Console.WriteLine(numbers[i]);
List<T>实现IEnumerable接口。因此,我们可以使用LINQ查询语法或方法语法来查询列表,如下所示。
var students = new List<Student>() { new Student(){ Id = 1, Name="Bill"}, new Student(){ Id = 2, Name="Steve"}, new Student(){ Id = 3, Name="Ram"}, new Student(){ Id = 4, Name="Abdul"} }; //得到所有名字叫 Bill 的学生 var result = from s in students where s.Name == "Bill" select s; foreach(var student in result) Console.WriteLine(student.Id + ", " + student.Name);
使用该Insert()方法将元素插入List<T>指定索引处的集合中。
Insert() 签名:
void Insert(int index, T item);
var numbers = new List<int>(){ 10, 20, 30, 40 }; numbers.Insert(1, 11);// 在第一个索引处插入11,在10之后。 foreach (var num in numbers) Console.Write(num);
使用Remove()方法删除List<T>集合中第一个出现的指定元素。使用RemoveAt()方法从指定索引中删除元素。如果指定索引处没有元素,则将抛出ArgumentOutOfRangeException。
Remove() 签名
bool Remove(T item)
RemoveAt() 签名
void RemoveAt(int index)
var numbers = new List<int>(){ 10, 20, 30, 40, 10 }; numbers.Remove(10); // 从列表中删除10 numbers.RemoveAt(2); //删除第三个元素(索引从0开始) //numbers.RemoveAt(10); //抛出ArgumentOutOfRangeException foreach (var el in intList) Console.Write(el); // 输出 20 30
使用Contains()方法确定元素是否在 List<T> 中。
var numbers = new List<int>(){ 10, 20, 30, 40 }; numbers.Contains(10); // 返回true numbers.Contains(11); // 返回false numbers.Contains(20); // 返回true
下图说明了List<T>层次结构。
下表列出了重要的List<T>类的属性和方法:
属性 | 用法 |
---|---|
Items | 获取或设置指定索引处的元素 |
Count | 返回List <T>中存在的元素总数 |
方法 | 用法 |
---|---|
Add | 在List <T>的末尾添加元素。 |
AddRange | 将指定集合的元素添加到List <T>的末尾。 |
BinarySearch | 搜索元素并返回该元素的索引。 |
Clear | 从List <T>中删除所有元素。 |
Contains | 检查指定元素在List <T>中是否存在。 |
Find | 根据指定的谓词函数查找第一个元素。 |
Foreach | 遍历 List <T>。 |
Insert | 在List <T>中的指定索引处插入元素。 |
InsertRange | 在指定的索引处插入另一个集合的元素。 |
Remove | 删除指定元素的第一次出现。 |
RemoveAt | 删除指定索引处的元素。 |
RemoveRange | 删除所有与提供的谓词功能匹配的元素。 |
Sort | 对所有元素进行排序。 |
TrimExcess | 将容量设置为实际的元素数。 |
TrueForAll | 确定List <T>中的每个元素是否与指定谓词定义的条件匹配。 |