4

我在 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 之外的其他值计算的,这些值以后不可用。 )

4

2 回答 2

8

如果将其扩展为使用完整的 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() 可能是昂贵的操作,而且是不必要的执行两次可能会对性能产生影响。

于 2009-02-09T20:43:57.090 回答
5

您不能在初始化程序中重用已初始化的属性。

我喜欢 Erik 的技术。如果查询表达式语法很麻烦,您可以使用完整的匿名方法。

        List<int> y = new List<int>() { 1, 2, 3, 4 };
        var x = y.Select(a =>
            {
                int b = a + 1;
                int c = a + 2;
                int d = b / c;
                return new { b = b, c = c, d = d };
            });
于 2009-02-09T20:48:46.453 回答