Добавление двух разных значений одновременно из одного списка с использованием метода LINQ / Extension - PullRequest
0 голосов
/ 01 февраля 2019

Чтобы уточнить мой заголовок, я приведу пример того, что у меня есть и что я хочу сделать (на самом деле я хочу реорганизовать некоторый код).

Итак, сначала я добавляю объекты в список:

var Impedances = new List<Impedance>()

с:

Impedances.Add(new Impedance (R,X)) - R и X - двойные значения.

Позже коды перебирают большой список'LinesOut' (ищет другие возможные объекты сопротивления), а затем выполняет следующие вычисления:

var sumRez = Impedances.Select(x => x.R).Sum();
var sumReak = Impedances.Select(y => y.X).Sum();
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sumRez, sumReak));

Результат представлен в представлении.Вопрос:

Как я могу изменить этот код, чтобы иметь меньше объявлений, но сделать Sum () для sumRez и sumReak в одной строке.Должен ли я добавить больше параметров в расширение Select () - если да, то как?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы можете просто использовать .Aggregate (который используется, чтобы взять последовательность значений и уменьшить ее до одного значения):

var sums = Impedances.Aggregate((i0, i1) => new Impedance() { R = i0.R + i1.R, X = i0.X + i1.X });
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sums.R, sums.X));

Как создать новый экземпляр Impedance может бытьразные, но это в основном так и работает.

0 голосов
/ 01 февраля 2019

Вы можете добавить следующее расширение

public static class ImpedanceExtensions
{
    public static Impedance SumImpedance(this IEnumerable<Impedance> collection)
    {
        var totalImpedance = new Impedance();

        foreach (Impedance impedance in collection)
        {
            totalImpedance.X += impedance.X;
            totalImpedance.R += impedance.R;
        }

        return totalImpedance;
    }
}

Использование

var sumImpedance = Impedances.SumImpedance();
var result = (c * model.voltageUDN) / (Math.Sqrt(3) * GetModule(sumImpedance.R, sumImpedance.X));
...