c# - LINQ 依赖计算赋值

标签 c# linq extension-methods design-patterns

我在 C# 中使用以下模式:

IList<foo> x = y.Select(a => new foo
{
    b = Calc1(),
    c = Calc2()
}).ToList();

foreach(foo f in x)
{
    f.d = b / c;
}

不过我想做的是:

IList<foo> x = y.Select(a => new foo
{
    b = Calc1(),
    c = Calc2()
    d = b / c;
}).ToList();

所以问题是:如何修改此模式以允许分配一个值,该值取决于分配期间正在计算的其他值?

(有人可能会指出 d 应该是一个进行计算并返回值的属性。这是一个人为的例子。假设 d 的值是使用除 c 和 b 之外的其他值计算的,这些值不是稍后可用。)

最佳答案

如果您扩展它以使用完整的 LINQ 语法:

IList<foo> x = (from a in y
                let bq = Calc1()
                let cq = Calc2()
                select new foo {
                    b = bq,
                    c = cq, 
                    d = bq / cq
                }).ToList();

这会让你得到你想要的。

有一个答案建议您重复您的方法调用(即 d = Calc1()/Calc2())——但我不建议这样做,因为 Calc1() 和 Calc2() 可能是昂贵的操作,并且不必要地执行它们两次可能会对性能产生影响。

关于c# - LINQ 依赖计算赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529836/

相关文章:

c# - 用于检查 null 或空的 Linq Lambda 表达式

c# - 如何在c#中捕获javascript HTTP重定向?

c# - Enum 的 Count 和 ToList 扩展方法?

对象的 C# 扩展方法

c# - 如何将await.WhenAny() 与GetAwaiter 扩展方法结合起来

c# - 如何根据第二个流将 Observable 流分成 block ?

c# - ASP.NET MVC 将 JSON 数据发送到 Controller 操作

linq - 在 LINQ 查询中使用组

c# - 在 LINQ 中按百分比分组

c# - 我如何使用 Reactive Extensions 将 IObservable<T>.Throttle() 与其他一些事件源结​​合起来?