这可能是一个愚蠢的问题,但我无法在任何地方找到答案。
我有一个实现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);
}
}
}
答案 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();
}