2012-01-11 2 views
5

저는 현재 매우 간단한 방법으로 CurveValue (사용자 지정 개체) 목록을 계산합니다. 문제는 매개 변수를 계산하고 실제로 변경하지 않고 소수를 전달해야한다는 것입니다. 매개 변수.AddRange() 및 LINQ 복사 문제

매개 변수 곡선에 영향을 미치지 않지만 참조가 여전히 존재하고 ForEach()가 수행 된 후에 양쪽 곡선 모두에 AddRange()를 시도하고 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); 
} 

업데이트

을 기존의 합계 방법을 통해 전달하는 다른 구현 제공 : 당신으로

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

죄송합니다. 내 코드를 업데이트했습니다. 합계는 분명한 방법입니다. 각 CurveValue 객체를 개별적으로 계산하고 합계해야합니다. 조작 측은 괜찮습니다. curveA에서 조작이 수행 될 때 왜 곡선이 갱신되는지 알 수 없습니다. – nik0lias

+2

@ nik0lias CurveA에는 곡선의 동일한 객체에 대한 참조가 포함되어 있으므로 변경할 때 동일한 객체를 계속 처리합니다 (curveA.ForEach (...)에서). –

+0

curveA에 커브를 복사하고 참조를 제거하는 쉬운 방법이 있습니까? 아니면 새로운 오브젝트를 열거하고 생성 한 후 curveA에 추가하는 것입니까? – nik0lias

3

을 List 컬렉션 사용하기, 선택 확장 방법을 사용할 수 있습니다. 이 메서드는 목록의 각 요소에 대해 변형 함수를 정의하고 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); 

코드를 확인하지 않으려 고 죄송합니다. 여기에 내 netbook에 있습니다. 내가 의미하는 바를 얻길 바랍니다.