有没有更好的方法来编写此扩展方法?
public static class StreamReaderExtensions
{
public static StreamReader SkipLines(this StreamReader reader, int lines)
{
for (var i = 0; i < lines; i++)
{
reader.ReadLine();
}
return reader;
}
}
我在想这样的事情:
int linesToSkip = 3;
linesToSkip.Do(reader => reader.ReadLine());
或者:
int linesToSkip = 3;
linesToSkip.Do(() => reader.ReadLine());
但是Do()
会是什么样的?
答案 0 :(得分:8)
尝试使用LINQ中已定义的电源。使用此扩展方法读取行:
public static IEnumerable<string> ReadLines(this StreamReader reader)
{
while (!reader.EndOfStream)
{
yield return reader.ReadLine();
}
}
然后,如果您打开StreamReader
,您的代码可能如下所示:
int linesToSkip = 3;
var lines = reader.ReadLines().Skip(linesToSkip);
享受。
答案 1 :(得分:0)
看看Eric Lippert的this article。
他举了这个例子来实现这样的扩展:
public static class FileUtilities
{
public static IEnumerable<string> Lines(string filename)
{
if (filename == null)
throw new ArgumentNullException("filename");
return LinesCore(filename);
}
private static IEnumerable<string> LinesCore(string filename)
{
Debug.Assert(filename != null);
using(var reader = new StreamReader(filename))
{
while (true)
{
string line = reader.ReadLine();
if (line == null)
yield break;
yield return line;
}
}
}
}
如果拥有此功能,只需使用Skip()
,SkipWhile()
,TakeWhile()
等内容,即可使用LINQ的正常功能。