gpt4 book ai didi

c# - 如何将 ReadLine 循环重构为 Linq

转载 作者:行者123 更新时间:2023-11-30 13:30:44 25 4
gpt4 key购买 nike

我想让下面的代码更清晰(在旁观者看来)。

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

关于c# - 如何将 ReadLine 循环重构为 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com