Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Взвешенное среднее двух списков, используя LINQ-выражение

#c_sharp #linq


У меня есть два списка, например:

List1 = new List{4, 6, 9},  
List2 = new List{12,3, 7}


Как найти взвешенное среднее этих списков, используя лямбда-выражение? (без циклов).

Результат должен получится такой:

weightedAverage = (4*12+6*3+9*7)/(12+3+7).

    


Ответы

Ответ 1



Давайте решать задачу по частям. Чтобы найти сумму элементов списка, проще всего воспользоваться LINQ-функцией Sum. Знаменатель у нас получается List2.Sum(). Теперь, в числителе нам нужно подсчитать попарные произведения (а суммировать мы умеем уже). Для того, чтобы подсчитать попарные чтобы-то-ни-было, используется Zip, в который вторым аргументом передаётся лямбда-функция, которая будет применена к парам элементов. Числитель получается List1.Zip(List2, (x, y) => x * y). Не забываем добавить в конец .Sum(), чтобы получить сумму этих самых попарных произведений. Выходит: var weightedAverage = List1.Zip(List2, (x, y) => x * y).Sum() / List2.Sum(); Ещё один момент: когда вы считаете средневзвешенное 1 и 2 с весами 1, вы ведь хотите получить 1.5, верно? Значит, при делении неплохо бы преобразовать к double, иначе получим целочисленное деление. Итого, окончательный ответ var weightedAverage = (double)List1.Zip(List2, (x, y) => x * y).Sum() / List2.Sum();

Комментариев нет:

Отправить комментарий