在C#中,List是一种泛型可变大小数组,它可以动态地增加或减少容量。List <T>是强类型对象的集合,可以通过索引对其进行访问,并具有用于排序,搜索和修改列表的方法。
List在System.Collections.Generic命名空间中,ArrayList的泛型版本,使用前需要引用此命名空间。
本节又会引出很多概念,比如泛型、集合、动态数组等,从能看明白的地方开始,有不明白的地方直接跳过,后面学的多了再往前翻,回顾回顾就都会了,学习编程不能急。
List的特点
List 是一个泛型类,因此它具有以下特点:
- 在System.Collection.Generic命名空间下。
- 类型安全:可以包含指定类型的元素,在编译时就能检查类型是否正确,并且不执行装箱/拆箱,因为它是泛型的。。
- 动态大小:和数组不同,List 的大小是动态的,可以根据需要增加或减少,等效于ArrayList。
- 方便的访问:可以通过索引直接访问元素。可以通过传递索引来访问元素,例如myList[0]。索引从零开始
- 方便的操作:提供了丰富的添加、删除、查找和遍历元素的方法,比如使用Add(),AddRange()方法等。
- 与ArrayList相比,执行速度更快,出错更少。
List的语法格式
List<T> list = new List<T>();
//T 是一个类型参数,可以是任何类型,比如 int、string、自定义的类等等。
List的使用方法
List 有很多内置方法,例如:
- Add(T item): 在列表的末尾添加一个元素。
- Insert(int index, T item): 在指定索引处插入一个元素。
- RemoveAt(int index): 移除指定索引处的元素。
- Clear(): 移除列表中的所有元素。
- Contains(T item): 判断列表中是否包含某个元素。
- IndexOf(T item): 返回元素在列表中的索引,如果列表不包含该元素,则返回 -1。
创建LIST:创建列表和添加元素
完整示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CreatListType
{
internal class Program
{
static void Main(string[] args)
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
List<string> list2 = new List<string>();//string
list1.Add(1);
list1.Add(2);
list1.Add(3);
list1.Add(4);
list1.Add(5);
list2.Add("a");
list2.Add("b");
list2.Add("c");
list2.Add("d");
list2.Add("e");
//Console.WriteLine(list1);//运行后观察下类型System.Collections.Generic.List`1[System.Int32]
//Console.WriteLine(list2);// System.Collections.Generic.List`1[System.String]
Console.WriteLine(list1[0]);//1
Console.WriteLine(list1[1]);//2
Console.WriteLine(list2[1]);//a
}
}
}
//可以尝试输出不存在的索引号(list1[8]),看看结果。
插入(Insert)元素(在指定位置插入元素)
完整示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InsertListType
{
internal class Program
{
static void Main(string[] args)
{
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
List<string> list2 = new List<string>();//string
list1.Add(1);//索引0
list1.Add(2);//索引1
list1.Add(3);//索引2
list1.Add(4);//索引3
list1.Add(5);//索引4
Console.WriteLine("当前元素数量为:{0}",list1.Count);//5
Console.WriteLine("未插入数字时索引0是:{0} ",list1[0]);//1
Console.WriteLine("未插入数字时索引1是:{0} ", list1[1]);//2
Console.WriteLine("未插入数字时索引2是:{0} ", list1[2]);//3
Console.WriteLine("未插入数字后索引4是:{0} ", list1[4]);//5
//插入后list会变长
list1.Insert(0, 2);//在索引号0处插入2
Console.WriteLine("插入后元素数量是:{0} ",list1.Count);//6
Console.WriteLine("插入数字后索引0是:{0} ", list1[0]);//2
Console.WriteLine("插入数字后索引1是:{0} ", list1[1]);//1
Console.WriteLine("插入数字后索引2是:{0} ", list1[2]);//2
Console.WriteLine("插入数字后索引4是:{0} ", list1[4]);//4
Console.WriteLine("插入数字后索引5是:{0} ", list1[5]);//5
}
}
}
}
//可以尝试插入不存在的索引号,看看结果。
移除(Remove)元素(移除指定位置元素)
完整示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace RemoveList
{
internal class Program
{
static void Main(string[] args)
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
list1.Add(1);//索引0
list1.Add(2);//索引1
list1.Add(3);//索引2
list1.Add(4);//索引3
list1.Add(5);//索引4
Console.WriteLine("当前元素数量为:{0}", list1.Count);//5
Console.WriteLine("未移除数字时索引0是:{0} ", list1[0]);//1
Console.WriteLine("未移除数字时索引1是:{0} ", list1[1]);//2
Console.WriteLine("未移除数字时索引2是:{0} ", list1[2]);//3
Console.WriteLine("未移除数字后索引4是:{0} ", list1[4]);//5
//插入后list会变长
list1.Remove(0);//移除索引号0处的元素
Console.WriteLine("移除后元素数量是:{0} ", list1.Count);//5
Console.WriteLine("移除数字后索引0是:{0} ", list1[0]);//2
Console.WriteLine("移除数字后索引1是:{0} ", list1[1]);//1
Console.WriteLine("移除数字后索引2是:{0} ", list1[2]);//2
Console.WriteLine("移除数字后索引4是:{0} ", list1[4]);//4
//超出当前list的范围了,会报错
//Console.WriteLine("移除数字后索引5是:{0} ", list1[5]);//报错
}
}
}
因开始是在5个元素(1,2,3,4,5)在索引0处插入2变为6个元素(2,1,2,3,4,5)现在移除了索引0的元素(2),变为和最开始的列表相同了(先插入了2,后又移除了2)再输出第6个元素的时候就会出错了。
移除列表内所有元素(清空列表)Clear
完整示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClearList
{
internal class Program
{
static void Main(string[] args)
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
list1.Add(1);//索引0
list1.Add(2);//索引1
list1.Add(3);//索引2
list1.Add(4);//索引3
list1.Add(5);//索引4
Console.WriteLine("当前元素数量为:{0}", list1.Count);//5
Console.WriteLine("未清空列表时索引0是:{0} ", list1[0]);//1
Console.WriteLine("未清空列表时索引1是:{0} ", list1[1]);//2
Console.WriteLine("未清空列表时索引2是:{0} ", list1[2]);//3
Console.WriteLine("未清空列表时索引4是:{0} ", list1[4]);//5
list1.Clear();
Console.WriteLine("当前元素数量为:{0}", list1.Count);//0
}
}
}
检查(inspect)列表中的元素
判断列表中是否包含某个元素。
完整示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InspectList
{
internal class Program
{
static void Main(string[] args)
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
list1.Add(1);//索引0
list1.Add(2);//索引1
list1.Add(3);//索引2
list1.Add(4);//索引3
list1.Add(5);//索引4
bool result = list1.Contains(1);//TRUE
if (result) //判断
{
Console.WriteLine("列表中存在");
}
else
{
Console.WriteLine("列表中不存在");
}
}
}
}
//把list1.Contains(1)换成list1.Contains(9);试试看看效果。
再完善下刚才的代码,如果列表中存在该元素,想知道该元素的索引怎么办?
完整代码示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
namespace InspectList
{
internal class Program
{
static void Main(string[] args)
{
//创建列表和添加元素
List<int> list1 = new List<int>();//仔细看数据类型(int)
list1.Add(1);//索引0
list1.Add(2);//索引1
list1.Add(3);//索引2
list1.Add(4);//索引3
list1.Add(5);//索引4
int element = 1;//元素
bool result = list1.Contains(element);//TRUE
int indexOfNum=list1.IndexOf(element);//获取索引号
if (result)
{
Console.WriteLine("列表中存在,索引为:{0}",indexOfNum);
}
else
{
Console.WriteLine("列表中不存在");
}
}
}
}
本节开篇概念相关汇总:
List和泛型的关系
List 是一个泛型类,它的类型参数可以是任何类型。可以创建一个 List<int>、List<string>、List<CustomClass> 等等。泛型让 List 可以更加灵活和类型安全地处理不同类型的数据。
泛型:泛型是 C# 的一种特性,它允许你编写一个可以处理任何类型的代码。泛型的类型参数(即上述代码中的 T)可以是任何类型,包括类、结构体、接口、委托等。泛型可以提高代码的重用性和类型安全性。
List与数组的关系
List 和数组都可以用来存储一组数据,但它们的实现和使用方式有所不同。数组的大小是固定的,而 List 的大小是动态的。这意味着你可以在运行时向 List 添加或删除元素,而不需要像数组那样手动调整大小。此外,List 提供了更多方便的操作方法,如添加、删除和查找元素。然而,相对于数组,List 的性能可能会稍微慢一些。在实际开发中,应根据具体需求和场景选择使用数组还是 List。
List和集合的关系
在C#中,集合(Collection)是一个泛指,它包含了许多类型的集合类,如List、Dictionary、Set等。List 是集合的一种实现方式,具有动态数组的特性,可以方便地添加、删除和查找元素。其他集合类型如 Dictionary 具有键值对的特性,Set 具有去重的特性等。在实际开发中,应根据具体需求和场景选择使用哪种集合类型。
这里仅做简述。