I have two simiiliar methods for parsing lines. first method
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;
}
And second
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;
}
Is it possible to implement this pattern?
As i think, you can create common Contract (Interface) for this Line Classes, and use for example Generic Method.
IEnumerable<IDataLine> GetLines<T>(Func<object> parseFunction)
{
...
var dataLine = parseFunction(line);
if (dataLine == null)
{
continue;
}
...
}
Or you can create IParser and inject it into the method
IEnumerable<IDataLine> GetLines<T>(IParser parser)
{
...
if (!parser.CanParse(line))
{
continue;
}
var dataLine = parser.Parse(line);
...
}
Last sample more similar to the Strategy Pattern.