2

n 個の要素を持つクラスと、要素の二乗和平方根を返すプロパティがあります。

public double Length 
{ 
    get 
    { 
        double sum = 0.0; 
        Elements.Select(t => sum += t * t);  
        return Math.Sqrt(sum); 
    } 
}

ただし、それは機能しません。要素の値に関係なく、合計は 0.0 のままです。
なぜこれが機能しないのですか?

注: 既に別の方法で実装していますが、上記のコードが機能しない理由を理解しようとしています。

4

3 に答える 3

7

LINQ は遅延実行を使用します。Select メソッドは、すべての要素に対してラムダをすぐに実行するのではなく、IEnumerable<T>を返します。これは、実行されると、列挙された各要素に対してラムダを実行します。

また、LINQ はクエリ用であり、各要素のコード ブロックを実行するためのものではないことに注意してください。ラムダにステートメントがなく、副作用のない式のみが含まれるようにコードを記述する必要があります。合計を計算しようとしている場合は、 Sum メソッドを使用できます。

public double Length 
{ 
    get 
    { 
        double sum = elements.Select(t => t * t).Sum();
        return Math.Sqrt(sum); 
    } 
}

また

public double Length 
{ 
    get 
    { 
        double sum = elements.Sum(t => t * t);
        return Math.Sqrt(sum); 
    } 
}
于 2012-07-02T02:00:23.757 に答える
3

遅延実行。

これを試して:

public double Length
{
    get { return Math.Sqrt(Elements.Sum(t => t * t)); }
}

ここでは、linq クエリがすぐに実行されます。

于 2012-07-02T01:57:38.657 に答える
0

実行が延期されているため、これは機能しません。あなたはこれを読むことができます

LINQと遅延実行

LINQの遅延実行を理解する

于 2012-07-02T02:08:49.303 に答える