我想使下面的代码更简洁(在情人眼中)。
var lines = new StringReader(lotsOfIncomingLinesWithNewLineCharacters);
var resultingLines = new List<string>();
string line;
while( (line = lines.ReadLine() ) != null )
{
if( line.Substring(0,5) == "value" )
{
resultingLines.Add(line);
}
}
像
var resultingLinesQuery =
lotsOfIncomingLinesWithNewLineCharacters
.Where(s=>s.Substring(0,5) == "value );
希望我已经说明了我希望不将结果作为列表(以不占用内存),并且StringReader不是强制性的。
有一个天真的解决方案来创建扩展并将ReadLine移动到那里,但我觉得可能会有更好的方法。
最佳答案
基本上,您需要一种从TextReader
提取行的方法。这是一个仅重复一次的简单解决方案:
public static IEnumerable<string> ReadLines(this TextReader reader)
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
您可以将其用于:
var resultingLinesQuery =
new StringReader(lotsOfIncomingLinesWithNewLineCharacters)
.ReadLines()
.Where(s => s.Substring(0,5) == "value");
但理想情况下,您应该能够多次遍历
IEnumerable<T>
。如果只需要此字符串,则可以使用:public static IEnumerable<string> SplitIntoLines(this string text)
{
using (var reader = new StringReader(text))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
然后:
var resultingLinesQuery =
lotsOfIncomingLinesWithNewLineCharacters
.SplitIntoLines()
.Where(s => s.Substring(0,5) == "value");