Почему комбинированные лямбда-выражения не работают в linq? - PullRequest
0 голосов
/ 26 декабря 2011

Делегаты могут быть объединены, поэтому:

MethodInvoker del = delegate { Console.WriteLine("Delegate 1"); };
del += delegate { Console.WriteLine("Delegate 2"); };
del.Invoke();

Выходы:

Delegate 1 
Delegate 2

Поскольку он вызывает оба метода, я попробовал это, чтобы увидеть, будет ли это работать:

Func<Person, bool> filters = person => person.Name.Contains("John");
filters += person => person.Age >= 18;

List<Person> persons = getPersons();

persons.Where(filters);

Но это не так, применяется только последний (в данном случае person => person.Age >= 18).

Мой вопрос: почему бы и нет?Возможно ли это реализовать?(не то чтобы я переписывал методы расширения Linq просто для реализации этого, но было бы круто, если это возможно)

Примечание: Я знаю, что в LINQ to Objects выполнение этого было бы аналогичным, так какисполнение отложено:

persons.Where( x => x.Name.Contains( nameFilter )).Where( x => x.Age >= 18 );

Но это не то, что меня интересует.

Ответы [ 2 ]

5 голосов
/ 26 декабря 2011

Причина в том, что оба фильтра выполняются, но используется только возвращаемое значение последнего делегата. Так работают делегаты согласно спецификации. Как говорят комментарии, я не могу представить, как это будет работать по-другому. Вы намекаете, что результаты должны быть AND ed, но почему они не могут быть OR ed? Что бы произошло, если бы результаты были strings?

1 голос
/ 26 декабря 2011

Это работает только с делегатами Action, но не с делегатами Func, поскольку вызов делегата может вернуть только один единственный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...