// 让列表扩容到最大的可能容量(大约2G的元素数据),防止溢出 if ((uint)newCapacity > Array.MaxLength) newCapacity = Array.MaxLength;
// 如果扩容力度不够,采用capacity的容量 if (newCapacity < capacity) newCapacity = capacity;
return newCapacity; }
常用操作
初始化列表
创建一个空列表:
1
List<int> bad = new List<int>();
从已有的数组创建列表:
1 2
int[] s = [1, 1, 4, 5, 1, 4]; List<int> bad = new List<int>(s);
访问列表元素
由于.NET列表是基于数组实现的,在访问元素的效率上和数组相当。
1 2
int first = bad[0]; // 获取列表的第1个元素 bad[1] = 2; // 修改列表的第2个元素的值为2
添加,插入与删除
若未触发扩容操作,向列表后增加元素的时间复杂度是O(1):
1 2 3 4 5 6
// 在列表的尾部添加元素 bad.Add(1); bad.Add(9);
// 添加多个元素 bad.AddRange([1, 9, 8, 1, 0]);
插入和删除元素的时间复杂度均为O(n):
1 2
bad.Insert(3, 0); // 在 bad 列表索引为 3 的位置插入 0 值 bad.RemoveAt(3); // 删除 bad 列表索引为 3 的元素
遍历
可以通过for或foreach关键字来遍历列表的元素,和数组类似:
1 2 3 4 5 6 7 8 9 10 11
// 通过 for 循环得到列表的索引,从而获取值 int total = 0; for (int i=0; i<bad.Count; i++) { total += bad[i]; }
// 通过 foreach 得到列表的各个元素 total = 0; foreach (int num in bad) { total += num; }
排序
.NET的列表可以通过list.Sort()方法来让列表元素进行从小到大的排列。
对于更复杂的排序,譬如当元素是对象的时候,通过对象内的某个属性排序,则需要使用LINQ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var personA = new Person(10, "A"); var personB = new Person(17, "B"); var personC = new Person(22, "C"); var personList = new List<Person> {personC, personA, personB}; /* C(22) A(10) B(17) */ personList = personList.OrderBy(person => person.Age).ToList(); /* A(10) B(17) C(22) */
classPerson(intage, stringname) { publicint Age {get; init;} = age; publicstring Name {get; init;} = name; }