DEV Community

Discussion on: WTF Is a Lambda?

Collapse
 
dance2die profile image
Sung M. Kim • Edited

If anyone's coming from "JavaScript" background, you will find that it works very similar to the JavaScript's lambda.

To show the similarity (using the examples in this article)

1 - You can leave out () if you have only one argument passed.

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

2 - You can pass the method name

var amy = People.SingleOrDefault(() => IsAmy());
// or
var amy = People.SingleOrDefault(IsAmy);

Both lambda syntax are the same in C# & JavaScript.

Collapse
 
hdv profile image
Hussein Duvigneau • Edited

You can go one step further:

things.SingleOrDefault(({name}) => name === "Bob");

Collapse
 
dance2die profile image
Sung M. Kim • Edited

I wasn't able to replicate the object desconstruction in C# as you could do in JavaScript (even after implementing Deconstruct)

dotnetfiddle.net/Wbx3ac

using System;
using System.Linq;
using System.Collections.Generic;

// https://dev.to/jonhilt/wtf-is-a-lambda-2dg2

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

    // Allow Object Deconstructuring/destructuring
    // https://docs.microsoft.com/en-us/dotnet/csharp/deconstruct#deconstructing-a-user-defined-type-with-discards
    public void Deconstruct(out string name, out int age) {
        name = Name;
        age = Age;
    }

    public override string ToString() {
        return $"Name={this.Name}, Age={this.Age}"; 
    }
}

public class Program
{
    static List<Person> people = new List<Person>
    {
        new Person { Name = "Bob", Age = 37 },
        new Person { Name = "Brian", Age = 21 },
        new Person { Name = "Amy", Age = 58 }
    };

    public static void Main()
    {
        // This works
//      var bob = people.SingleOrDefault(person => person.Name == "Bob");
        // But this doesn't
//      var bob = people.SingleOrDefault(({name}) => name == "Bob");
        var bob = people.SingleOrDefault(((Name, _)) => Name == "Bob");
        Console.WriteLine(bob);
    }
}

And Roslyn 2.0 compiler complains...


}
Compilation error (line 39, col 48): Invalid expression term '=>'
Compilation error (line 39, col 48): Syntax error, ',' expected
Compilation error (line 39, col 51): Syntax error, ',' expected
Compilation error (line 39, col 38): The type or namespace name 'Name' could not be found (are you missing a using directive or an assembly reference?)
Compilation error (line 39, col 44): The type or namespace name '_' could not be found (are you missing a using directive or an assembly reference?)
Compilation error (line 39, col 37): Predefined type 'System.ValueTuple`2' is not defined or imported
Compilation error (line 39, col 51): The name 'Name' does not exist in the current context
Thread Thread
 
hdv profile image
Hussein Duvigneau

Sorry, I was talking explicitly on JS terms

Thread Thread
 
dance2die profile image
Sung M. Kim

No worries, mate~ 😉