我想使下面的代码更简洁(在情人眼中)。

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");

07-26 09:29