有没有办法用linq积累一些东西.
初始代码:
Something oneItem;
List<Something> allItems;
while ((oneLine = _generator.GenerateSomething()) != null)
allItems.Add(_generator.CurrentItem);
Run Code Online (Sandbox Code Playgroud)
我想要像:
var allItems = Enumerable.Take( ()=>_generator.GenerateSomething()).While(item=>item !=null).ToList();
Run Code Online (Sandbox Code Playgroud)
实际上,如果生成器实现IEnumerable会非常好,我会这样使用它:
var allItems = _generator.TakeWhile(item !=null);
Run Code Online (Sandbox Code Playgroud)
最后一个很容易理解,我想解决它(我可以使用一种生成机器状态的包装器,给出一个生产方法(_generator.GenerateSomething())和一个停止条件(item == null).但我不能写这个额外的类或某些原因).
编写一个与File.ReadLines概念等效的函数.摘要一次从控制台读取行的代码,以便可以重用.
public static IEnumerable<string> ReadLinesFromConsole()
{
while (true)
{
var next = Console.ReadLine();
if (next == null)
yield break;
yield return next;
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你真的想要概括它,你可以.你在这里有一个简单的发电机接受一个功能.
public static IEnumerable<T> Generate<T>(Func<T> generator)
{
while (true)
yield return generator();
}
Run Code Online (Sandbox Code Playgroud)
这允许您编写示例中的代码:
var allLines = Generate(() => Console.ReadLine())
.TakeWhile(line => line != null);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4604 次 |
| 最近记录: |