IEnumerable-如何对两个枚举器使用一种方法

这可能是一个愚蠢的问题,但我在任何地方都找不到答案.

我有一个实现IEnumerable< KeyValuePair< int,Line>>的简单类.这是文件读取器的基类,它读取我们从银行收到的EFT平面文件.

派生的类实现您在代码中看到的抽象GetNext方法,并返回Line派生的类型,具体取决于它们读取的行的类型.最初,派生读者的调用者会循环调用GetNext直到EOF,直到它们返回null.使用枚举器,他们可以改为调用foreach,并遍历阅读器.

但是为什么我必须实现两个枚举器?两者做的完全一样.而且我无法通过右键单击=>重构它来调用相同的方法.重构=>提取方法,因为该方法包含yield语句.但是可以肯定的是,我可以同时使用两种方法吗?这种方法的签名是什么?

using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace EasyDebit.BankInterface
{
    public abstract class FileReader : IEnumerable<KeyValuePair<int, Line>>
    {
        protected int current;
        protected List<string> lines = new List<string>();
        private string filename;

        public FileReader(string filename)
        {
            this.filename = filename;
            this.lines = File.ReadAllLines(filename).ToList();
        }

        public string Filename
        {
            get { return filename; }
        }

        public IEnumerator<KeyValuePair<int, Line>> GetEnumerator()
        {
            Line line = null;
            current = 0;

            while ((line = GetNext()) != null)
                yield return new KeyValuePair<int, Line>(current, line);
        }

        public abstract Line GetNext();

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            Line line = null;
            current = 0;

            while ((line = GetNext()) != null)
                yield return new KeyValuePair<int, Line>(current, line);
        }
    }
}

解决方法:

只需将其强制转换即可消除重复的代码.

    public IEnumerator<KeyValuePair<int, Line>> GetEnumerator()
    {
        Line line = null;
        current = 0;

        while ((line = GetNext()) != null)
            yield return new KeyValuePair<int, Line>(current, line);
    }

    public abstract Line GetNext();

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return (IEnumerator)GetEnumerator();
    }
上一篇:列出使用Python SUDS进行SOAP枚举的所有可能值


下一篇:java-为什么在打印输出时必须将枚举元素转换为String?