跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp Predicate 委托
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C# Predicate委托 = '''Predicate委托'''是C#中预定义的泛型委托类型,用于表示对一个特定条件进行测试的方法。它通常用于集合操作中,根据指定的条件筛选元素。Predicate委托返回一个布尔值,指示输入对象是否满足条件。 == 定义与语法 == Predicate委托的声明如下: <syntaxhighlight lang="csharp"> public delegate bool Predicate<in T>(T obj); </syntaxhighlight> 其中: * '''T''':输入参数的类型 * '''obj''':要测试的对象 * 返回值:如果obj满足条件则返回true,否则返回false == 基本用法 == 以下示例展示如何声明和使用Predicate委托: <syntaxhighlight lang="csharp"> // 定义一个检查数字是否为偶数的Predicate Predicate<int> isEven = num => num % 2 == 0; // 使用Predicate Console.WriteLine(isEven(4)); // 输出: True Console.WriteLine(isEven(5)); // 输出: False </syntaxhighlight> == 与集合操作结合 == Predicate委托常用于List<T>的FindAll、Find、Exists等方法中: <syntaxhighlight lang="csharp"> List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 }; // 使用Predicate查找所有偶数 List<int> evenNumbers = numbers.FindAll(isEven); Console.WriteLine(string.Join(", ", evenNumbers)); // 输出: 2, 4, 6 </syntaxhighlight> == Lambda表达式简化 == 可以直接使用Lambda表达式替代显式Predicate声明: <syntaxhighlight lang="csharp"> List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" }; // 使用Lambda表达式作为Predicate var longNames = names.FindAll(name => name.Length > 4); Console.WriteLine(string.Join(", ", longNames)); // 输出: Alice, Charlie, David </syntaxhighlight> == 实际应用场景 == === 场景1:数据筛选 === 在数据处理中,Predicate可用于筛选符合特定条件的数据: <syntaxhighlight lang="csharp"> class Product { public string Name { get; set; } public decimal Price { get; set; } } List<Product> products = new List<Product> { new Product { Name = "Laptop", Price = 999.99m }, new Product { Name = "Mouse", Price = 25.50m }, new Product { Name = "Keyboard", Price = 49.99m } }; // 筛选价格低于50的产品 Predicate<Product> isCheap = p => p.Price < 50; var cheapProducts = products.FindAll(isCheap); foreach (var product in cheapProducts) { Console.WriteLine($"{product.Name}: {product.Price}"); } // 输出: // Mouse: 25.50 // Keyboard: 49.99 </syntaxhighlight> === 场景2:验证规则 === Predicate可用于实现验证逻辑: <syntaxhighlight lang="csharp"> Predicate<string> isValidEmail = email => email.Contains("@") && email.EndsWith(".com"); Console.WriteLine(isValidEmail("test@example.com")); // True Console.WriteLine(isValidEmail("invalid.email")); // False </syntaxhighlight> == Predicate与其他委托的比较 == <mermaid> classDiagram class Predicate{ +bool Invoke(T obj) } class Func{ +TResult Invoke(T arg) } class Action{ +void Invoke(T arg) } Predicate --|> Delegate Func --|> Delegate Action --|> Delegate </mermaid> 主要区别: * '''Predicate<T>''':接受一个参数并返回bool * '''Func<T, bool>''':功能上与Predicate相同,但属于Func委托家族 * '''Action<T>''':接受一个参数但不返回值 == 性能考虑 == 使用Predicate委托会有微小的性能开销,因为涉及委托调用。在性能关键的代码中,可以考虑直接使用方法调用或内联代码。 == 数学表示 == Predicate可以表示为从类型T到布尔值的函数: <math>P: T \rightarrow \{ \text{true}, \text{false} \}</math> == 总结 == * Predicate委托是返回bool值的单参数委托 * 主要用于集合筛选和条件测试 * 可以使用Lambda表达式简化语法 * 功能上等同于Func<T, bool>,但语义更明确 * 在LINQ中,通常使用Func<T, bool>替代Predicate == 进阶练习 == 1. 创建一个Predicate<int>,检查数字是否为质数 2. 使用Predicate<string>实现一个密码强度验证器 3. 比较List<T>.FindAll(Predicate)与LINQ Where()方法的性能差异 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 委托与lambda]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)