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