Объяснить x => x.ToString () // упростить так много вызовов - PullRequest
7 голосов
/ 01 октября 2008

В ответе на вопрос я нашел следующий совет по кодированию: -

2) простые лямбды с одним параметром:

x => x.ToString() //simplify so many calls

Как человек, который еще не использовал 3.0, я не совсем понимаю этот совет, но он выглядит интересным, поэтому я был бы признателен за расширение того, как это упрощает вызовы, на нескольких примерах.

Я исследовал лямбды, поэтому я думаю Я знаю, что они делают, однако я может не полностью понимаю, так что распаковка маленькая также может быть в порядке .

Ответы [ 4 ]

21 голосов
/ 01 октября 2008

Когда вам нужно создать экземпляр делегата, который имеет один параметр, лямбда-выражения позволяют вам создать этот делегат «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.

2 голосов
/ 01 октября 2008

Это в основном расширяется до:

private string Lambda(object x) {
  return x.ToString();
}
1 голос
/ 01 октября 2008

Вы знакомы с анонимными методами в C # 2.0? Эти два вызова эквивалентны (при условии, что SomeMethod принимает делегата и т. Д.):

SomeMethod(x => x.ToString());

SomeMethod(delegate (SomeType x) { return x.ToString();});

Я знаю, что я предпочел бы напечатать ...

0 голосов
/ 01 октября 2008
string delegate(TypeOfX x)
{
  return x.ToString();
}
...