Collection<T>、泛型
-
集合:集合是一种容器,可以用来存储多个数据。
集合和数组既然都是容器,它们有啥区别呢?
-
数组的长度是固定的。集合的长度是可变的。
-
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
// 创建集合对象 // 使用多态形式 Collection<string> coll = new Collection<string>(); // 使用方法 // 添加功能 coll.Add("小李广"); coll.Add("扫地僧"); coll.Add("石破天"); // 判断是否在集合中存在 Console.WriteLine("判断扫地僧是否在集合中" + coll.Contains("扫地僧")); //删除在集合中的元素 Console.WriteLine("删除石破天:" + coll.Remove("石破天")); // 集合中有几个元素 Console.WriteLine("集合中有" + coll.Count + "个元素"); // void clear() 清空集合 coll.Clear(); Console.ReadLine();
-
迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
IEnumerable接口的常用方法属性如下:
public bool MoveNext ():如果仍有元素可以迭代,则返回 true,如果枚举数传递到集合的末尾,则为 false
。
public object Current { get; }:获取集合中位于枚举数当前位置的元素。
接下来我们通过案例学习如何使用IEnumerator迭代集合中元素:
Collection<string> coll = new Collection<string>(); // 添加元素到集合 coll.Add("串串星人"); coll.Add("吐槽星人"); coll.Add("汪星人"); //使用迭代器 遍历 每个集合对象都有自己的迭代器 IEnumerable<string> stringsFound = coll; var str = stringsFound.GetEnumerator(); while (str.MoveNext())//判断是否有迭代元素 { var s = str.Current;//获取迭代出的元素 Console.WriteLine(s); } Console.ReadLine();
我们在之前案例已经完成了IEnumerable遍历集合的整个过程。当遍历集合时,首先通过调用集合的GetEmumerator()方法获得迭代器对象,然后使用MoveNext()方法判断集合中是否存在下一个元素,如果存在,则调用Current属性将元素取出,否则说明已到达了集合末尾,停止遍历元素。
格式:
foreach(元素的数据类型 变量 in Collection集合or数组){
//写操作代码
}
int[] arr = { 3, 5, 6, 87 }; //使用增强foreach遍历数组 foreach (int a in arr) {//a代表数组中的每个元素 Console.WriteLine(a); } Console.ReadLine();
Collection<string> coll = new Collection<string>(); coll.Add("小河神"); coll.Add("老河神"); coll.Add("神婆"); //使用foreach遍历 foreach (string s in coll) {//接收变量s代表 代表被遍历到的集合元素 Console.WriteLine(s); } Console.ReadLine();
ArrayList coll = new ArrayList(); coll.Add("abc"); coll.Add("itcast"); coll.Add(5);//由于集合没有做任何限定,任何类型都可以给其中存放 IEnumerable stringsFound = coll; var str = stringsFound.GetEnumerator(); while (str.MoveNext()) { //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型 string strs = (string)str.Current; Console.WriteLine(strs); } Console.ReadLine();
程序在运行时发生了问题System.InvalidCastException。
为什么会发生类型转换异常呢? 我们来分析下:由于集合中什么类型的元素都可以存储。导致取出时强转引发运行时 InvalidCastException。 怎么来解决这个问题呢?
-
泛型:可以在类或方法中预支地使用未知的类型。
tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
避免了类型强转的麻烦。
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
此时只能接受数据,不能往该集合中存储数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具