Простой вопрос относительно выражения лямбдаC# сложность выражения лямбда
Я хотел получить среднее значение по всем сделкам в следующем коде. Формула, которую я использую, равна ((цена 1 * qty 1+ (цена 2 * qty 2) .... + (цена n * qty n)/(qty 1 + qty 2 + ... + qty n)
В следующем коде я использую функцию sum, чтобы вычислить общее количество (цена * qty), а сложность будет равна O (n) и еще раз, чтобы добавить все значения сложности O (n). есть ли способ, можно найти суммирование как с использованием сложности O (N) означает одно выражение лямбды, которое может вычислить оба результата.
Используя цикл, можно рассчитать оба результата в O (N) сложность.
class Program
{
static void Main(string[] args)
{
List<Trade> trades = new List<Trade>()
{
new Trade() {price=2,qty=2},
new Trade() {price=3,qty=3}
};
///using lambda
int price = trades.Sum(x => x.price * x.qty);
int qty = trades.Sum(x => x.qty);
///using for loop
int totalPriceQty=0, totalQty=0;
for (int i = 0; i < trades.Count; ++i)
{
totalPriceQty += trades[i].price * trades[i].qty;
totalQty += trades[i].qty;
}
Console.WriteLine("Average {0}", qty != 0 ? price/qty : 0);
Console.Read();
}
}
class Trade
{
public int price;
public int qty;
}
Редактировать: Я знаю, что коэффициент не учитывается. Позвольте мне перефразировать вопрос, сказав, что с лямбдой мы будем проходить через каждый элемент в списке дважды, а в цикле for мы будем проходить через каждый элемент только один раз. Есть ли какое-либо решение с лямбдой, поэтому ему не нужно дважды перебирать элементы списка?
Если у вас есть две процедуры, которые являются O (n), то один за другим выполняется O (n). – recursive
Я знаю это, но я просто хотел обратить внимание на двойную петлю через элемент списка, когда мы используем lambda – mchicago
. Вам также может быть интересно прочитать эту статью [Parallel Aggregation] (http://msdn.microsoft.com/en-us/ библиотека/ff963547.aspx). Просто потому, что вы добавляете целую кучу цифр, это не значит, что вы должны делать это последовательно. – R0MANARMY