关于C# Predicate委托使用的困惑及实现咨询
嘿,作为C#新手想尝试Predicate委托的思路很棒!我来帮你纠正代码里的问题,一步步实现你要的功能~
首先,先说说你原来代码里的几个错误点:
- 泛型参数选错了:
Predicate<string>不对,因为我们要判断的是集合里的ListOfAuthorizedUserForTestDashBoard对象,不是直接判断string类型。Predicate的泛型参数应该和集合元素类型一致。 - 委托逻辑搞反了:Predicate是用来定义「单个元素是否符合条件」的规则,而不是在委托里直接调用
Any遍历整个集合。 - 缺少返回值:Predicate要求返回bool类型,你的匿名委托里没写
return,语法上就通不过。
接下来是正确的实现方式,分两种写法(匿名委托和更简洁的Lambda表达式):
第一步:定义正确的Predicate委托
假设你要查找的目标用户名是targetUsername,我们先定义一个Predicate,用来判断单个用户对象的userID是否匹配目标值:
string targetUsername = "username"; // 你要查找的用户名 // 写法1:匿名委托 Predicate<ListOfAuthorizedUserForTestDashBoard> isUserMatch = delegate(ListOfAuthorizedUserForTestDashBoard user) { return user.userID == targetUsername; }; // 写法2:Lambda表达式(C#3.0+推荐,更简洁) Predicate<ListOfAuthorizedUserForTestDashBoard> isUserMatch = user => user.userID == targetUsername;
第二步:用Predicate判断集合中是否存在匹配元素
因为你的usersForT是IEnumerable<T>类型,有两种方式使用这个Predicate:
方式1:转成List后用Exists方法
List<T>有专门接受Predicate<T>的Exists方法,所以可以先把IEnumerable转成List:
bool userExists = usersForT.ToList().Exists(isUserMatch);
方式2:直接用Any方法
因为Predicate<T>和Func<T, bool>的签名完全一致(都是接受T类型参数,返回bool),所以可以直接把Predicate传递给Any方法:
bool userExists = usersForT.Any(isUserMatch);
完整示例代码
把所有逻辑整合起来就是这样:
// 初始化数据 RepositoryForDashboard rp = new RepositoryForDashboard(); IEnumerable<ListOfAuthorizedUserForTestDashBoard> usersForT = rp.listOfusersForT(); string targetUsername = "username"; // 定义Predicate Predicate<ListOfAuthorizedUserForTestDashBoard> isUserMatch = user => user.userID == targetUsername; // 检查是否存在匹配用户 bool exists = usersForT.Any(isUserMatch); // 或者直接用List.Exists bool existsViaList = usersForT.ToList().Exists(isUserMatch);
如果不想单独声明Predicate变量,也可以直接把Lambda表达式写到方法里,比如:
bool exists = usersForT.ToList().Exists(user => user.userID == targetUsername);
这样就完美实现了你原来用Any(e=>e.userID==username)的功能,同时也学会了Predicate委托的正确用法~
内容的提问来源于stack exchange,提问作者user9704250
相关产品推荐
相关产品推荐

