首页 > 解决方案 > 实现 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。请让我们知道实现这一目标的方法是什么?

标签: c#.netienumerabledatarowienumerator

解决方案


老实说,除非您有非常特殊的要求,否则最好在此处使用迭代器块,即您只需编写:

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>,但是有很多陷阱(例如允许独立并发枚举)使得让编译器更安全地执行努力工作。


推荐阅读