目录
涉及知识点: IEnumerator 、 IEnumerable
一、IEnumerator 概念
IEnumerator 枚举器: 在枚举器中实现,下标自增,数据提取
属性:Current -- 当前下标位置
方法:MoveNext() -- 移动到下一个
Reset() -- 复位
Dispose() -- 释放迭代
IEnumerable 枚举器接口: 只要一个类型实现了IEnumerable接口,就可以对他进行foreach
方法:GetEnumerator() -- 返回循环访问集合的枚举数
二、IEnumerator 案例
1、IEnumerator C#1 最早版本源码
代码编写:
internal class Program
{
static void Main(string[] args)
{
string[] number = { "23", "23", "245" };
StudentIEnumerable Tom = new StudentIEnumerable(number);
foreach (object? item in Tom)
{
Console.WriteLine(item);
}
//返回值: 23
// 23
// 245
Console.WriteLine("Hello World!");
}
}
//枚举接口
public class StudentIEnumerable : IEnumerable
{
object[] _objValue;
public StudentIEnumerable(object[] objValue)
{
this._objValue = objValue;
}
public IEnumerator GetEnumerator()
{
return new StudentIEnumerator(_objValue);
}
}
//枚举器
public class StudentIEnumerator : IEnumerator
{
object[] _objValue { get; }
int _position = -1;
public StudentIEnumerator(object[] objValue)
{
_objValue = objValue;
}
//当前值
public object Current
{
get
{
if (_position == -1 || _position == _objValue.Length)
{
return false;
}
return _objValue[_position];
}
}
//索引向下移一个
public bool MoveNext()
{
if (_position++ < _objValue.Length - 1)
{
return true;
}
return false;
}
//复位
public void Reset()
{
_position = -1;
}
}
结果显示:
2、IEnumerator C#2版本源码
建议:复制,自己跑一遍
代码编写:
class Program
{
static readonly string Padding = "abcd";
static IEnumerable<int> CreateEnumerable()
{
Console.WriteLine("---CreateEnumerable()方法开始---");
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"{i}--开始 yield ");
Console.WriteLine($"******{Padding[i]}******");
yield return i;
Console.WriteLine($"{i}--结束 yield ");
}
yield return -1;
Console.WriteLine("--- CreateEnumerable()方法结束---");
}
static void Main(string[] args)
{
IEnumerable<int> iterable = CreateEnumerable();
IEnumerator<int> iterator = iterable.GetEnumerator();
Console.WriteLine("-------------迭代开始---------");
while (true)
{
Console.WriteLine("---调用MoveNext()方法");
bool result = iterator.MoveNext();
Console.WriteLine($"MoveNext方法返回值:{result}");
if (!result)
{
break;
}
Console.WriteLine($"当前指针位置:{iterator.Current}");
Console.WriteLine();
}
Console.WriteLine("-------------迭代结束---------");
}
}
结果显示:
3、IEnumerator 时间案例 -- 实战
代码编写:
class Program
{
static IEnumerable<DateTime> DataRange(DateTime dataTimeEnd)
{
for (DateTime i = DateTime.Now; i < dataTimeEnd; i = i.AddDays(1))
{
yield return i;
}
}
static void Main(string[] args)
{
DateTime dateTimeEnd = DateTime.Now.AddDays(5);
foreach (DateTime item in DataRange(dateTimeEnd))
{
Console.WriteLine(item.ToString());
}
}
}
结果显示:
4、IEnumerator 文件读取案例 -- 实战
前期准备:
代码编写:
class Program
{
static void Main(string[] args)
{
string fileName = "C:\\Users\\Rush\\Desktop\\C#\\linq查询\\123.txt";
foreach (string line in ReadLines(fileName))
{
Console.WriteLine(line);
}
}
static IEnumerable<string> ReadLines(string fileName)
{
string line;
using (TextReader reader = File.OpenText(fileName))
{
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
}
结果显示:
如有错误,烦请批评指正