c# - 实现 IEnumerator 时如何强输入“Current”
问题描述
我们正在课堂上实现 IEnumerator 和 IEnumerable
static void Main(string[] args)
{
ParsingFile data = new ParsingFile();
foreach (var line in data) // Calls the current, the implicit type of line is object but we want is as a DataRow
{
//call MoveNext
}
}
public class ParsingFile : IEnumerator , IEnumerable
{
object IEnumerator.Current //need the object to be of type DataRow to avoid casting in foreach
{
//return a DataRow
}
public IEnumerator GetEnumerator()
{
return this;
}
public bool MoveNext()
{
//Do something
}
}
current 的返回类型是 object 但要显式返回 DataRow。请让我们知道实现这一目标的方法是什么?
解决方案
老实说,除非您有非常特殊的要求,否则最好在此处使用迭代器块,即您只需编写:
public class ParsingFile : IEnumerable<DataRow>
{
// use an iterator block for the typed API
public IEnumerator<DataRow> GetEnumerator()
{
//Do something that involves, perhaps in a loop
// yield return someValue;
// and/or
// yield break;
}
// use explicit implementation for the untyped API
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
您绝对可以实现自己的强类型枚举器,这可能(尽管并不严格需要)意味着实现IEnumerator<T>
,但是有很多陷阱(例如允许独立并发枚举)使得让编译器更安全地执行努力工作。
推荐阅读
- python - 按时间戳过滤数据框
- python - 为动态创建的子图共享 y 轴
- android - Jetpack Compose 从视图模型展示小吃店 - 单场直播活动
- mysql - 递归更新开始结束日期以避免重叠
- javascript - UnhandledPromiseRejectionWarning:ObjectParameterError:Document()的参数“obj”必须是一个对象
- go - 如何在 Windows 上安装和使用 git-sizer (Github, VS Code)
- javascript - 如何使用数组方法将具有相同属性值的对象组合在一个数组中
- javascript - 多变量的一个函数
- firebase - Firebase_auth - 用于空值的空检查运算符
- wildfly - Wildfly 检测数据库连接泄漏