List<T> 底层是一个Arry的数组来存储数据的,当存储的数据数量大于原来的数组长度的时,会创建一个新数组并且长度=原来长度*2来存储数据,所有又被加"动态数组"。
元素个数:Count <= 容量:Capacity(手动或自动调整)
与非泛型ArrayList相对应(存储的数据类型是Object类,在使用时会进行装箱,拆箱,影响性能)
String.Join(",",item); 就item里面的元素以','连接起来。
创建组:
1.构造器:3个重载
1.默认:List<T> tList=new List<T>();
2.给初始值(必须是实现了IEnumerable接口的)
T[] t=new T[]{};
List<T> tList=new List<T>(t);
3.给初始容量
List<T> tList=new List<T>(30);//初始大小是30
当一个集合有Add(),那么这个集合有初始化器
List<int> intList=new List<int>(){1,2,3};
2.元素:
1.Add(值) 把值添加到原来集合的末尾。
2.AddRange(一段值) 把一段值添加到原来集合的末尾,并且值是实现了IEnumerable 接口的。
3.Insert(插入位置的索引值,值) 插入值到某一个位置。
4.InsertRange(插入位置的索引值,一段值) 插入一段值到某一个位置。
删除组:
1.Clear() 清空元素 但是Capacity 不会变化。
2.RemoveAt(索引值) 删除索引值对应的元素。
3.RemoveRange(索引值,个数) 删除索引值开始也个数为长度的一段元素。
4.Remove(值) 根据值删除,但是只会删除匹配值的第一个值
5.RemoveAll(Lambda表达式) 删除匹配到的所有值 】
阅读组:
1.Count
2.Capacity
3.item[索引值]
4.GetRange(开始索引值,需要取出来的个数) 本质是Copy
值类型是深度Copy,引用类型是浅Copy
5.GetEnumerator() 迭代器
6.ForEach(Lambda表达式) 迭代方法
for循环 在进行集合的增删改查时需要注意:
1.进行插入时,需要手动进行i++。不然会出现死循环
2.进行删除时,需要手动进行i--。不然会出现删除不完全
索引器:集合提供的可以提供索引进行查询的方式,不是所有的集合都有索引器。
迭代器:集合提供的进行查询集合所有的元素的方式,所有的集合都有迭代器。
var e=item.GetEnumerator();
e.Current 获取迭代出来的元素
e.MoveNext() 判断是否进行下一次迭代
迭代器通常和while,do while 循环使用
foreach循环底层是Enumerator迭代器 在迭代时要求集合的长度不能改变,所以foreach不能进行集合的增删。
修改操作需要看情况:
1.值类型:不可以
2.引用类型的一个变量值:可以修改
查找组:
1.Contains(值) 返回bool类型 底层是使用的是Equals() 判断是否是同一个对象
2.Exists(Lambda表达式) 返回bool类型 Exists(e=>e==500)
3.TrueForAll(Lambda表达式) 返回bool类型 如果集合里面的元素都满足表达式的要求 那么返回true 否则返回false
4.IndexOf(值) 返回查询到的第一个出现的值的索引
5.IndexOf(值,索引值) 返回从索引值开始找出现的第一个值的索引值
6.IndexOf(值,索引值,查找的个数); 返回从索引值开始查,查找给的个数,找到的第一次出现的索引值
7.LastIndexOf() 和IndexOf() 的三个重载方法一样 不过就是从后面开始查
8.Find(Lambda表达式) 从头开始找,返回找到的满足条件的第一个的索引值
9.FindLast(Lambda表达式) 从尾开始找,返回找到的满足条件的第一个的索引值
10.FindAll(Lambda表达式) 返回满足条件的所有的索引值
11.FindIndex(Lambda表达式) 从头开始找,返回找到的满足条件的第一个的索引值
12.FindIndex(索引值,Lambda表达式) 返回从索引值开始找出现的第一个值的索引值
13.FindIndex(索引值,查找的长度,Lambda表达式) 返回从索引值开始查,查找的个数,找到的第一次出现的索引值
14.FindLastIndex() 和FindIndex() 的三个重载方法一样 不过就是从后面开始查
15.BinarySearch(值) 返回排序好(小->大)的查询到的满足条件的第一个索引值。
16.Sort() 排序,从小到大
注意:集合在使用Sort方法进行排序时,实质上是集合调用了元素的ComparableTo 方法对元素进行比较排序,但是自定义的类没有这个方法,所以要手动去让类实现IComparable<类名> 接口
重写ComparableTo 方法。
例子:
List<int> intList=new List<int>(){1,2,3,4,5,6,2,4,7,5,6,9};
1.IndexOf(2) //返回1
2.IndexOf(2,3) //返回6
3.IndexOf(2,3,2) //返回-1 没有找到
4.LastIndexOf(2) //返回 6
5.LastIndexOf(2,3)//返回1
6.LastIndexOf(2,3,2) //返回 -1 没有找到