IEnumerable <t> - 如何为两个枚举器使用一种方法</t>

时间:2014-10-20 12:29:10

标签: c# enumeration

这可能是一个愚蠢的问题,但我无法在任何地方找到答案。

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

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

但为什么我必须实施两个枚举器?两者都完全相同。我无法通过右键单击=&gt;来重构它以调用相同的方法。重构=&gt;提取方法,因为该方法包含 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);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

只需将其转换为消除重复的代码。

    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();
    }