我有两种类似的方法来解析代码行。第一种方法
public IList<LasLine> GetLasLines(string section)
{
var lasLines = new List<LasLine>();
bool startParse = false; // Секція знайдена і почати парсити її
foreach(var line in _lines)
{
if(GetSectionName(line).Equals(section) && !startParse)
{
startParse = true;
}
else
{
if(IsCommentLine(line)) continue;
if(IsBeginSection(line)) break;
LasLine lasLine;
if(!TryParseLasLine(line, out lasLine)) continue;
lasLines.Add(lasLine);
}
}
return lasLines;
}第二个
public IList<AsciiLogDataLine> GetAsciiLogData()
{
var asciiLogData = new List<AsciiLogDataLine>();
bool startParse = false;
foreach(var line in _lines)
{
if(GetSectionName(line).Equals(LasSectionName.ASCIISection) && !startParse)
{
startParse = true;
}
else
{
if(IsCommentLine(line)) continue;
AsciiLogDataLine asciiLogDataLine;
if(!TryParseAsciiLogDataLine(line, out asciiLogDataLine)) continue; asciiLogData.Add(asciiLogDataLine);
}
}
return asciiLogData;
}是否有可能实现此模式?
发布于 2012-05-04 21:25:49
我认为,您可以为这个Line类创建公共的Contract (接口),并使用例如泛型方法。
IEnumerable<IDataLine> GetLines<T>(Func<object> parseFunction)
{
...
var dataLine = parseFunction(line);
if (dataLine == null)
{
continue;
}
...
}或者,您可以创建IParser并将其注入到方法中
IEnumerable<IDataLine> GetLines<T>(IParser parser)
{
...
if (!parser.CanParse(line))
{
continue;
}
var dataLine = parser.Parse(line);
...
}最后一个样本更类似于策略模式。
https://stackoverflow.com/questions/10449013
复制相似问题