有什么岁月静好,不过是有人替你负重前行!哪

Collection<T>、泛型

1.1 集合概述

  • 集合:集合是一种容器,可以用来存储多个数据。

集合和数组既然都是容器,它们有啥区别呢?

  • 数组的长度是固定的。集合的长度是可变的。

  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

1.2 Collection 常用功能

Collection是提供泛型集合的基类,因此在Collection中定义了通用的一些方法和属性,方法如下:

public void Add (T item):把给定的对象添加到当前集合末尾中 。

public void Clear ():清空集合中所有的元素。

public bool Remove (T item):把给定的对象在当前集合中删除。

public bool Contains (T item):判断当前集合中是否包含给定的对象。

public int Count { get; }:获取 当前集合中实际包含的元素数。

方法演示:

复制代码
// 创建集合对象
// 使用多态形式
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();
复制代码

2.1IEnumerable迭代器

在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,专门提供了一个接口public interface IEnumerable<out T> : System.Collections.IEnumerable,而IEnumerable主要用于迭代访问(即遍历)Collection中的元素,因此IIEnumerable对象也被称为迭代器。

想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:

GetEnumerator ():获取集合对应的迭代器,用来遍历集合中的元素的。

下面介绍一下迭代的概念:

  • 迭代:即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();
复制代码

2.2 迭代器的实现原理

我们在之前案例已经完成了IEnumerable遍历集合的整个过程。当遍历集合时,首先通过调用集合的GetEmumerator()方法获得迭代器对象,然后使用MoveNext()方法判断集合中是否存在下一个元素,如果存在,则调用Current属性将元素取出,否则说明已到达了集合末尾,停止遍历元素。

2.3 foreach

增强for循环(也称foreach循环),专门用来遍历数组和集合的。它的内部原理其实是个迭代器

格式:

foreach(元素的数据类型 变量 in Collection集合or数组){
//写操作代码
}

练习1:遍历数组

            int[] arr = { 3, 5, 6, 87 };
            //使用增强foreach遍历数组
            foreach (int a in arr)
            {//a代表数组中的每个元素
                Console.WriteLine(a);
            }
            Console.ReadLine();

练习2:遍历集合

复制代码
     Collection<string> coll = new Collection<string>();
            coll.Add("小河神");
            coll.Add("老河神");
            coll.Add("神婆");
            //使用foreach遍历
            foreach (string s in coll)
            {//接收变量s代表 代表被遍历到的集合元素
                Console.WriteLine(s);
            }
            Console.ReadLine();
复制代码

3.1 泛型概述

在学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

大家观察下面代码:

复制代码
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。 怎么来解决这个问题呢?

ArrayList虽然可以存储各种对象,但实际上通常ArrayList只存储同一类型对象。例如都是存储字符串对象。因此有了泛型(Generic)语法,让你在设计API时可以指定类或方法支持泛型,这样我们使用API的时候也变得更为简洁,并得到了编译时期的语法检查。

  • 泛型:可以在类或方法中预支地使用未知的类型。

tips:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

3.2 使用泛型的好处

那么泛型带来了哪些好处呢?

  • 将运行时期的InvalidCastException,转移到了编译时期变成了编译失败。

  • 避免了类型强转的麻烦。

3.4 泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

通配符基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。

 

posted @   大果冻  阅读(255)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示