2012-01-11 12 views
5

Obecnie mam metodę, która jest dość prosta i oblicza listę CurveValue (obiekt niestandardowy), problem, który mam, to muszę obliczyć parametr i przekazać dziesiętny z powrotem bez faktycznej zmiany parametr.AddRange() i kwestia kopiowania LINQ

Próbowałem AddRange() do nowego obiektu, więc nie wpłynie to na krzywą parametru, ale wydaje się, że referencja nadal istnieje i po wykonaniu ForEach() zmieniła się zarówno krzywa, jak i krzywa A.

Przypuszczam, że jest on nadal przywoływany, ale czy istnieje prosty sposób wykonania tej operacji bez wyliczania za pomocą krzywej parametru i dodawania jej do krzywej A?

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); 
} 

Odpowiedz

6

można po prostu użyć the Sum method tak:

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

Aktualizacja

Zapewnienie kolejną realizację, która przechodzi przez do istniejącej metody Suma:

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

Przepraszam, zaktualizowałem mój kod. Suma jest tylko metodą, która robi oczywiste. Muszę obliczyć indywidualnie każdy obiekt CurveValue, a następnie je zsumować. Strona operacji jest w porządku, po prostu nie mam pojęcia, dlaczego krzywa jest aktualizowana, gdy operacja jest wykonywana na krzywejA. – nik0lias

+2

@ nik0lias CurveA zawiera odniesienia do dokładnie tych samych obiektów na krzywej, więc nadal masz do czynienia z tymi samymi obiektami podczas ich zmiany (w curveA.ForEach (...)). –

+0

Czy istnieje łatwy sposób kopiowania krzywej do krzywej A i usuwania odniesień? Czy jest to przypadek wyliczania i tworzenia nowych obiektów, a następnie dodawania ich do curveA? – nik0lias

3

jak ty używasz kolekcji list, możesz skorzystać z metody wyboru rozszerzenia. Ta metoda udostępnia parametr, w którym definiujesz funkcję transformacji dla każdego elementu na liście i zwraca wartość IEnumerable, gdzie T jest typem określonym w funkcji.

Nadzieja to pomaga :)

3

Może to być nieco old-school, ale dlaczego ty kopiowanie zakresu w ogóle?

Można po prostu powtórzyć krzywa i umieścić obliczoną wartość na liście wyników, a następnie zsumować wartości w górę.

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

return Sum(curveA); 

Przepraszam, że nie sprawdzam kodu, jestem tutaj na moim netbooku. Mam nadzieję, że zrozumiesz, o co mi chodzi.