#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();
Комментариев нет:
Отправить комментарий