而循环到linq

Tot*_*oto 2 c# linq

有没有办法用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).但我不能写这个额外的类或某些原因).

Ser*_*rvy 7

编写一个与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)

  • 哇,这比原始代码简单吗? (2认同)