Замена делегата лямбда-выражением - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь заменить следующее выражение лямбда-выражением:

 List<ABC> l = new List<ABC>();
  l.Find(delegate(ABC a) { return a.A == 4; });

Я пытался

 l.Find((ABC a)=>a.A==4;);

но это, очевидно, неправильно. Спасибо

Ответы [ 4 ]

9 голосов
/ 05 марта 2012

Просто чтобы быть полным, любой из них будет действительным:

// Fullest version
l.Find((ABC a) => { return a.A==4; });

// Infer the type of the parameter
l.Find((a) => { return a.A==4; });

// Single parameter - can remove the ()
l.Find(a => { return a.A==4; });

// Single expression - can remove braces and semi-colon
l.Find(a => a.A == 4);

(Вы можете использовать часть «одного выражения» независимо от других ярлыков.)

7 голосов
/ 05 марта 2012

Во-первых, обратите внимание, что по-прежнему является делегатом - просто: скорее, он использует лямбда-синтаксис , а не анонимный метод (это по сути означаетточно так же, хотя).

Что касается того, как это исправить: просто уберите ;:

l.Find((ABC a) => a.A == 4);

или более просто:

l.Find(a => a.A == 4);

(скобки необходимы только необходимо , если у вас несколько параметров; явные типы полезны для устранения неоднозначности)

4 голосов
/ 05 марта 2012

Попробуйте это

l.Find( (a) => a.A == 4);
2 голосов
/ 05 марта 2012

Почему вы не используете это простым способом, я думаю, что нет необходимости писать (ABC a):

l.Find(a => a.A == 4);

Это утверждение l.Find((a) => a.A == 4); можно записать как ваше утверждение l.Find(delegate(ABC a) { return a.A == 4; });.Как вы видели, предикат можно заменить анонимным методом (делегатом).

(.NET 2.0)

 fooList.Find(delegate (Foo f) { return f.Equals(fooTarget); });

или (более поздняя версия)

 fooList.Find(f => f.Equals(fooTarget));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...