AddRange()和LINQ复制问题

时间:2012-01-11 14:03:28

标签: c# .net linq sum

我目前有一个非常简单的方法并计算一个CurveValue(自定义对象)列表,我遇到的问题是我需要计算参数并传回小数而不实际更改参数。

我尝试将AddRange()放入一个新对象中,这样参数曲线就不会受到影响,但似乎参考仍然存在,并且在执行ForEach()后曲线和曲线A都发生了变化。

我假设它仍然被引用但是有一种简单的方法可以在不通过参数曲线枚举并将其添加到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);
}

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

当您使用List集合时,您可以使用Select扩展方法。此方法提供了一个参数,您可以在其中为列表中的每个元素定义转换函数,并返回IEnumerable,其中T是您在函数中指定的类型。

希望有所帮助:)

答案 2 :(得分:3)

这可能有点老派,但你为什么要复制这个范围呢?

您可以迭代曲线,并将计算出的值放入结果列表中,然后将值相加。

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

return Sum(curveA); 

很抱歉没有检查代码,我在这里上网本。我希望你明白我的意思。