WTF Is a Lambda?

January 30, 2019 · 3 minute read · Tags: csharp

If you’re just learning C# you’ve probably come across something like this and wondered what the weird x=>x is all about…

things.SingleOrDefault(x=>x.Name == "Bob");

To understand what’s going on, let’s explore a specific example.

Let’s say you have a collection of People.

Here’s a class to represent a Person…

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Then somewhere in your application, a list of people like this…

private List<Person> People = new List<Person>
{
    new Person { Name = "Bob", Age = 37 },
    new Person { Name = "Brian", Age = 21 },
    new Person { Name = "Amy", Age = 58 }
};

Three people in a list. Each object in the list is an instance of our Person class.

Now say you want to find the record for “Amy” and display her age.

You could do this manually by looping through each person until you find the relevant one…

public void Exists()
{
    Person result = null;

    foreach (var person in People)
    {
        if (person.Name == "Amy")
        {
            result = person;
            break;
        }
    }

    if (result != null)
        Console.WriteLine("we found Amy!, she's " + result.Age);
}

Result will be the instance of “Person” for Amy and we can write her age to the console.

Alternatively, rather than typing out endless loops yourself, you can use some methods built in to C# lists to save yourself a few keystrokes.

public void Exists()
{
    var amy = People.SingleOrDefault(IsAmy);
}

Under the covers, this will loop through the “People” list, and for each one it will call IsAmy to determine whether this is the person we want.

What does IsAmy look like I hear you ask.

private bool IsAmy(Person arg)
{
    return arg.Name == "Amy";
}

SingleOrDefault expects a function, which takes a Person and returns a bool.

In here we can put whatever logic we want.

If IsAmy returns true, then we’re saying this instance of Person is the one we want. If we return false we’re saying it isn’t.

We can “inline” our IsAmy function (to save declaring it separately) like so…

public void Exists()
{
    var amy = People.SingleOrDefault((Person person) => 
                                        { return person.Name == "Amy" });
}

This is exactly the same as the last example, except instead of declaring a separate function we’re declaring it “inline”.

You can see we’re still taking in a Person argument, then returning a true or false (true if “Amy”, false if not).

Finally, to make this more concise, we can simplify to this…

public void Exists()
{
    var amy = People.SingleOrDefault(person => person.Name == "Amy");
}

This is another way of declaring the same thing.

Here, we are still taking the Person, applying our condition to it and returning the result (true or false) but with less keystrokes!

So the left side of the => is the argument (Person), the right side is the expression which returns a boolean.

Essentially lambdas are really just syntactic sugar and a shorthand way of declaring a function.

You’ll see them used a lot with lists/other collections and therefore in relation to database queries etc.

Join the Practical ASP.NET Newsletter

Ship better Blazor apps, faster. One practical tip every Tuesday.

I respect your email privacy. Unsubscribe with one click.

    Next up

    WTF is an Action Delegate?
    How can you “swap in” different behaviours for a function? One way is to use C#’s Action Delegates