gpt4 book ai didi

c# - LINQ 以函数结果作为源(例如 Console.ReadLine)延迟执行

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

函数的结果是LINQ 查询 的来源。我希望每次使用查询时都对其进行延迟评估,而不是在创建它时将其锁定。这是我的意思的一个例子:

var query = from c in Console.ReadLine()
group c by char.IsDigit(c) into gr
select new { IsDigit = gr.Key, Count = gr.Count() };

Console.WriteLine()只运行一次 - 当 query 时被创建,即使没有像ToList()那样调用终止方法.我想要的是 Console.WriteLine() (或其位置的任何其他函数)仅在我将查询与 ToList() 一起使用时执行或 Count()等等

最佳答案

如果您不介意一些额外的基础设施,那还不错 - 您可以创建一个 DeferredEnumerable<T>每次请求迭代器时只执行给定委托(delegate)的类。然后,静态非泛型类可以帮助进行类型推断。完整示例:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

// Just for type inference...
public static class DeferredEnumerable
{
public static IEnumerable<T> For<T>(Func<IEnumerable<T>> func) =>
new DeferredEnumerable<T>(func);
}

public sealed class DeferredEnumerable<T> : IEnumerable<T>
{
private readonly Func<IEnumerable<T>> func;

public DeferredEnumerable(Func<IEnumerable<T>> func)
{
this.func = func;
}

public IEnumerator<T> GetEnumerator() => func().GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}

class Test
{
static void Main()
{
var query =
from c in DeferredEnumerable.For(Console.ReadLine)
group c by char.IsDigit(c) into gr
select new { IsDigit = gr.Key, Count = gr.Count() };


Console.WriteLine("First go round");
Console.WriteLine(string.Join(Environment.NewLine, query));

Console.WriteLine("Second go round");
Console.WriteLine(string.Join(Environment.NewLine, query));
}
}

关于c# - LINQ 以函数结果作为源(例如 Console.ReadLine)延迟执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45612948/

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