Метод C#, принимающий предикат - это смотрит хорошо?

Я хотел бы метод, который имеет следующий API:

//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);

Что-то вроде этого будет работать?

IList<User> GetUsers(Func<User, bool> predicate)
{            
  var users = GetAllUsers();
  return users.Where(predicate).ToList();                                                          
} 

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

myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
8
задан Ben 5 February 2010 в 11:43
поделиться

3 ответа

Выглядит абсолютно нормально. Однако, если вы хотите использовать предикат с чем-то вроде LINQ to SQL, вы должны использовать:

IList<User> GetUsers(Expression<Func<User, bool>> predicate)

Это означает, что лямбда-выражение будет преобразовано в дерево выражения вместо делегата - и это дерево выражения затем может быть преобразован в SQL.

19
ответ дан 5 December 2019 в 06:53
поделиться

Да, это сработает.

Вы говорите компилятору, что вы собираетесь передать функцию, которая работает с объектом User и возвращает bool - функция выглядит так: полностью зависит от вас. Вы можете получить довольно сложные элементы вложенности, используя ors ( || ) и ands ( && ), но если становится слишком сложно увидеть, что делает предикат, вам, вероятно, следует подумать рефакторинг.

Но в основном любая лямбда, которая принимает, например, u как объект User и превращает его в выражение, возвращающее bool , будет работать.

3
ответ дан 5 December 2019 в 06:53
поделиться

Один совет: вы можете использовать Predicate вместо Func , что немного понятнее (Predicate встроен в в .net 3.5, пространство имен System).

2
ответ дан 5 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: