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() が高価な操作であり、不必要にそれらを 2 回実行すると、パフォーマンスに影響する場合があります。

于 2009-02-09T20:43:57.090 に答える
5

初期化子で初期化されたプロパティを再利用することはできません。

私はエリックのテクニックが好きです。クエリ式の構文が面倒な場合は、完全な匿名メソッドを使用できます。

        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 に答える