Ivan
Ivan

Reputation: 7746

Replace lambda with a function

If I write this code, it works:

closestInPrice = list.OrderBy
                    (item => Math.Abs(2 * item.mid - price)).ToList();

If instead I try to replace the lambda with a function:

static double ComputeSpread(double mid, double price)
{
            return (2 * mid) - price;
}

Func<double, double, double> computeSpread = ComputeSpread;

closestInPrice = list.OrderBy(computeSpread).ToList();

it says the "type can't be inferred try explicitly":

Upvotes: 1

Views: 707

Answers (3)

Mark Seemann
Mark Seemann

Reputation: 233125

You don't have to change the ComputeSpread helper method. Just define computeSpread as a new function:

Func<Item, double> computeSpread = item => ComputeSpread(item.mid, price);
var closestInPrice = list.OrderBy(computeSpread).ToList();

This assumes that price is a local variable that computeSpread can close over.

Upvotes: 1

Caius Jard
Caius Jard

Reputation: 74595

You don't need computeSpread, but you do need to modify ComputeSpread to accept a single argument:

static double ComputeSpread(X item) //change X to whatever type is stored in your list
{
    return (2 * item.mid) - item.price;
}


closestInPrice = list.OrderBy(ComputeSpread).ToList();

You can also form your ComputeSpread like:

static double ComputeSpread(X item)  => (2 * item.mid) - item.price;

... would you do it? It depends how reusable you want ComputeSpread to be...

ps; If you put it in another class you might have to qualify it with a type and/or namespace name

closestInPrice = list.OrderBy(Helpers.ComputeSpread).ToList();

Upvotes: 1

James Gould
James Gould

Reputation: 4702

Part of your original lamba expression was accessing an object property, so you either need to explicitly pass that value when calling the function, or change the parameters of ComputeSpread to accept an item:

static double ComputeSpread(TClass item, double price)
{
    return (2 * item.mid) - price;
}

Upvotes: 2

Related Questions