Когда вам нужно создать экземпляр делегата, который имеет один параметр, лямбда-выражения позволяют вам создать этот делегат «inline» в очень сжатой форме. Например, вот код для поиска конкретного человека в списке по имени:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");
В C # 2.0 вы могли бы использовать анонимный метод, который был бы немного более длинным, но не слишком плохо:
List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });
В C # 1.0 вам нужно создать целый дополнительный метод. Кроме того, если вы хотите параметризовать его, вам придется создать другой тип, тогда как анонимные методы и лямбда-выражения захватывают их исполняющую среду (локальные переменные и т. Д.), Поэтому они действуют как замыкания:
public Person FindByName(List<Person> list, String name)
{
return list.Find(p => p.Name == name); // The "name" variable is captured
}
Подробнее об этом можно прочитать в моей статье о замыканиях .
Хотя передача делегатов в методы не очень распространена в C # 2.0 и .NET 2.0, это большая часть основы LINQ - поэтому вы часто используете его в C # 3.0 с .NET 3.5.