Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接受谓词的C#方法-这看起来可以吗?_C#_Linq_Lambda_Func_Predicates - Fatal编程技术网

接受谓词的C#方法-这看起来可以吗?

接受谓词的C#方法-这看起来可以吗?,c#,linq,lambda,func,predicates,C#,Linq,Lambda,Func,Predicates,我想要一个具有以下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.Wh

我想要一个具有以下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();                                                          
} 
是的,这会有用的

您告诉编译器的是,您将传递一个在
用户
对象上工作的函数,并返回一个
bool
——函数的外观完全取决于您。你可以使用ORS(Sui)和ODS(&)来获得非常复杂的嵌套素材,但是如果太难看谓词所做的事情,你可能应该考虑重构。
但基本上,任何lambda,例如,将
u
作为
User
对象,并将其转换为返回
bool
的表达式,都可以工作。

这看起来绝对不错。但是,如果要将谓词与LINQ to SQL之类的东西一起使用,则需要使用:

IList<User> GetUsers(Expression<Func<User, bool>> predicate)
IList GetUsers(表达式谓词)

这意味着lambda表达式将被转换为表达式树而不是委托-然后表达式树可以被转换为SQL。

一个提示:您可以使用谓词而不是Func,这更清楚一些(谓词内置于.net 3.5命名空间系统中).

为什么不返回用户的IEnumerable?IEnumerable是否更可取,因为它更灵活?IList是IEnumerable,所以IEnumerable的灵活性会更低。我想评论可能是针对可能不需要的ToList()调用?
谓词
实际上是在.NET2.0中,但是
Func
倾向于在LINQ中使用-部分原因是一些方法有
Func
。啊,我忘了它是在2.0中;你能给我举几个使用Func的方法的例子吗?非常感谢您的回复。感谢+1这个解释澄清了我对LINQ的理解。非常感谢谢谢你的回答。我使用LINQtoSQL,使用justfunc会抛出一个OutOfMemory异常。这很好用。
IList<User> GetUsers(Expression<Func<User, bool>> predicate)