AddRange()和LINQ复制问题

本文关键字:复制 问题 LINQ AddRange | 更新日期: 2023-09-27 18:19:56

我目前有一个非常简单的方法,可以计算CurveValue(自定义对象)的列表,我的问题是我需要计算参数并在不实际更改参数的情况下返回小数。

我试图将Range()添加到一个新对象中,这样参数曲线就不会受到影响,但引用似乎仍然存在,并且在执行ForEach()之后,曲线和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);
}

AddRange()和LINQ复制问题

您可以像这样使用Sum方法:

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

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

希望有帮助:)

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

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

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

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