C#中的迭代器基础
- 迭代器是可以返回相同类型的值的有序序列的一段代码。
- 迭代器可用作方法、运算符或 get 访问器的代码体。
- 迭代器代码使用 yield return 语句依次返回每个元素。 yield break 将终止迭代。
- 可以在类中实现多个迭代器。 每个迭代器都必须像任何类成员一样有唯一的名称,并且可以在 foreach 语句中被客户端代码调用,如下所示:foreach(int x in SampleClass.Iterator2){}。
- 迭代器的返回类型必须为 IEnumerable、IEnumerator、IEnumerable(Of T) 或 IEnumerator(Of T)。
- 迭代器是 LINQ 查询中延迟执行行为的基础。
yield 关键字用于指定返回的一个或多个值。 到达 yield return 语句时,会保存当前位置。 下次调用迭代器时将从此位置重新开始执行。
迭代器对集合类特别有用,它提供一种简单的方法来迭代复杂的数据结构(如二进制树)。
--摘自MSDN
其实照我的理解来说,迭代器就是可以用foreach访问的数据,也就说,是一个集合。
按照上面的迭代器返回类型来看,那么我们自己也可以用类继承迭代器的接口来实现我们自己的迭代器。
实现继承IEnumerable接口的迭代器的类,需要实现GetEnumerator()方法,举一个例子:
1 public class CityCollection : IEnumerable
2 {
3 string[] _Items = new string[] { "黑龙江", "吉林", "辽宁", "山东", "山西", "陕西", "河北", "河南", "湖南", "湖北", "四川", "广西", "云南", "其他" };
4 IEnumerator IEnumerable.GetEnumerator()
5 {
6 for (int i = 0; i < _Items.Length; i++)
7 {
8 yield return _Items[i];
9 }
10 }
11 }
这样的话,就是一个基本的迭代类了,我们创建CityCollection对象后就可以使用foreach便利它了。
1 CityCollection collection = new CityCollection();
2 foreach (string item in collection)
3 {
4 Console.WriteLine(item);
5 }
但是IEnumerable是一个泛型接口,未加泛型的话,也就只能进行遍历,而不能使用了LINQ查询的方式对这个集合进行查询或者其他操作了,所以,我们可以将上面的迭代类进行一下修改,增加泛型类型,修改如下:
1 public class CityCollection : IEnumerable<string>
2 {
3 string[] _Items = new string[] { "黑龙江", "吉林", "辽宁", "山东", "山西", "陕西", "河北", "河南", "湖南", "湖北", "四川", "广西", "云南", "其他" };
4 IEnumerator<string> IEnumerable<string>.GetEnumerator()
5 {
6 for (int i = 0; i < _Items.Length; i++)
7 {
8 yield return _Items[i];
9 }
10 }
11 IEnumerator IEnumerable.GetEnumerator()
12 {
13 for (int i = 0; i < _Items.Length; i++)
14 {
15 yield return _Items[i];
16 }
17 }
18 }
通过上面的修改,便利的时候就可以使用LINQ的进行自身的结果集查询和其他的操作了,具体这个东西怎么叫,我还真的不清楚,也表述不清楚,所以就这么说,那位高手知道的话,还请指教,谢谢了。
1 static void Main(string[] args)
2 {
3 CityCollection collection = new CityCollection();
4 foreach (string item in collection)
5 {
6 Console.WriteLine(item);
7 }
8 Console.WriteLine("查询方法:");
9 foreach (string item in collection.Where(t => t.Contains("河")))
10 {
11 Console.WriteLine(item);
12 }
13 System.Console.ReadKey();
14 }
高手可以无视的,但是希望高手给指教下,上面代码中的where的查询方式专业的名词叫什么,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库