AddRange()和LINQ复制问题

nik*_*ias 5 .net c# 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);
}
Run Code Online (Sandbox Code Playgroud)

Ric*_*lly 6

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

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

更新

提供另一个传递给现有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);
}
Run Code Online (Sandbox Code Playgroud)

  • @ nik0lias CurveA包含对曲线中完全相同对象的引用,因此在更改它们时仍然处理相同的对象(在curveA.ForEach(...)中). (2认同)