2012-01-11 10 views
5

私は現在、非常に単純で、CurveValue(カスタムオブジェクト)のリストを計算しています。問題はパラメータを計算し、実際には変更せずに小数点を戻す必要があります。パラメータ。AddRange()とLINQコピーの問題

新しいオブジェクトにAddRange()を実行しようとしましたが、パラメータ曲線には影響しませんが、参照がまだ存在し、ForEach()が実行された後にcurveとcurveAの両方が変更されたようです。

私はそれがまだ参照されていると仮定していますが、パラメータカーブを列挙してcurveAに追加しないと、これを行う簡単な方法がありますか?

public decimal Multiply(List<CurveValue> curve, decimal dVal) 
{ 
    List<CurveValue> curveA = new List<CurveValue>(); 
    curveA.AddRange(curve); 

    curveA.ForEach(a => a.Value = decimal.Round(a.Value, 4) * dVal); 

    return Sum(curveA); 
} 

public decimal Sum(List<CurveValue> curveA) 
{ 
    return curveA.Sum(x => x.Value); 
} 

答えて

6

あなたはそうのようなthe Sum methodを使用することができます。

public decimal Multiply(IEnumerable<CurveValue> curve, decimal dVal) 
{ 
    return curve.Sum(a => decimal.Round(a.Value, 4) * dVal); 
} 

更新

を既存のSum方法に通過する別の実装の提供:あなたのよう

public decimal Multiply(IEnumerable<CurveValue> curve, decimal dVal) 
{ 
    IEnumerable<CurveValue> curveA = curve.Select(c => new Curve { Value = decimal.Round(c.Value, 4) * dVal }); 
    return Sum(curveA); 
} 

public decimal Sum(IEnumerable<CurveValue> curveA) 
{ 
    return curveA.Sum(x => x.Value); 
} 
+0

申し訳ありませんが、私のコードを更新しました。 Sumは単なる明らかな方法です。個々のCurveValueオブジェクトを個別に計算し、これらの合計を計算する必要があります。操作側はうまくいきますが、curveAで操作が実行されているときに、なぜカーブが更新されているのか分かりません。 – nik0lias

+2

@ nik0lias CurveAには、カーブ内のまったく同じオブジェクトへの参照が含まれているため、同じオブジェクトを変更しても(curveA.ForEach(...)では)同じオブジェクトを扱います。 –

+0

curveAに曲線をコピーして参照を削除する簡単な方法はありますか?それとも、新しいオブジェクトを列挙して作成し、それをcurveAに追加するケースですか? – nik0lias

3

をListコレクションを使用していますが、 Select拡張メソッドを使用することができます。このメソッドは、リスト上の各要素の変換関数を定義し、IEnumerableを返します。ここで、Tは関数で指定した型です。

はそれが役に立てば幸い:)

3

これは少し古い学校かもしれないが、なぜあなたはすべてで範囲をコピーしていますか?

カーブを繰り返すだけで、計算された値を結果リストに入れて、値を合計することができます。

List<CurveValue> curveA = new List<CurveValue>();   
curve.ForEach(a => curveA.Add(new CurveValue {Value = decimal.Round(a.Value, 4) * dVal });   

return Sum(curveA); 

申し訳ありませんがコードをチェックしていないため、私はここに自分のネットブックを持っています。私はあなたが私が意味するものを得ることを望みます。