AddRange () и проблема копирования LINQ - PullRequest
5 голосов
/ 11 января 2012

В настоящее время у меня есть довольно простой метод, который вычисляет список CurveValue (пользовательский объект), проблема в том, что мне нужно вычислить параметр и передать десятичную запятую без фактического изменения параметра.

Я пытался добавить AddRange () в новый объект, чтобы не повредить кривую параметров, но кажется, что ссылка все еще существует, и после выполнения ForEach () изменились как кривая, так и кривая A.

I 'м, если на него все еще ссылаются, но есть ли простой способ сделать это, не перечисляя кривую параметров и не добавляя ее к кривой 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);
}

Ответы [ 3 ]

6 голосов
/ 11 января 2012

Вы можете просто использовать метод Сумма примерно так:

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);
}
3 голосов
/ 11 января 2012

Это может быть немного старой школы, но зачем вообще копировать диапазон?

Вы можете просто выполнить итерацию по кривой и поместить вычисленное значение в список результатов, а затем суммировать значения.

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

return Sum(curveA); 

Извините, что не проверили код, я здесь на своем нетбуке. Я надеюсь, вы понимаете, о чем я.

3 голосов
/ 11 января 2012

Поскольку вы используете коллекцию списков, вы можете использовать метод расширения расширений.Этот метод предоставляет параметр, где вы определяете функцию преобразования для каждого элемента в вашем списке и возвращает IEnumerable, где T - это тип, который вы указываете для своей функции.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...