C#如何在for循环中动态合并多个Func<T,TResult>为单个委托
解决方案
1. 通用Func合并工具方法
先实现两个通用合并方法,支持任意数量的Func<string, bool>按||(或)、&&(与)逻辑合并,自带短路执行特性,完全覆盖你的业务扩展需求:
// 合并多个Func为"或"逻辑:任意一个委托返回true则整体返回true,后续不再执行 public static Func<string, bool> CombineOr(params Func<string, bool>[] predicates) { return str => { foreach (var predicate in predicates) { if (predicate(str)) return true; } return false; }; } // 合并多个Func为"与"逻辑:所有委托返回true则整体返回true,任意一个返回false则终止执行 public static Func<string, bool> CombineAnd(params Func<string, bool>[] predicates) { return str => { foreach (var predicate in predicates) { if (!predicate(str)) return false; } return true; }; }
2. 修正GetData方法实现
你原示例代码存在三处需要调整的问题:
- lambda语法错误:不能在
||两侧重复写str =>声明参数 - for循环初始化错误:
int i = i属于无效赋值,应该从i=1开始遍历(第一个元素已单独初始化) - 闭包捕获循环变量陷阱:循环中直接使用
i会导致所有lambda最终捕获到循环结束后的i值,需要在循环内部单独定义变量存储当前遍历值
修正后代码如下:
public static Func<string, bool> GetData(string request) { var data = request.Split(','); if (data.Length == 0) return _ => false; // 空输入容错处理 var predicates = new List<Func<string, bool>>(); // 初始化第一个校验规则,可替换为实际的多行逻辑Func Func<string, bool> firstRule = str => str.ToUpper() == data[0] || str.ToLower() == data[0]; predicates.Add(firstRule); // 循环添加剩余校验规则 for (int i = 1; i < data.Length; i++) { // 循环内单独定义变量,规避闭包捕获问题 var currentItem = data[i]; Func<string, bool> rule = str => str.ToUpper() == currentItem || str.ToLower() == currentItem; // 此处可替换为任意多行逻辑的Func实现 predicates.Add(rule); } // 按或逻辑合并所有规则后返回 return CombineOr(predicates.ToArray()); }
3. 多委托&&合并用法
后续如果有多个返回Func<string, bool>的方法需要按与逻辑合并,直接调用CombineAnd即可:
// 示例:三个不同校验方法返回的Func按&&逻辑合并 var func1 = GetData("校验参数1"); var func2 = GetCustomCheckFunc(); var func3 = GetBusinessCheckFunc(); // 合并后委托:只有三个校验全部通过才返回true var combinedFunc = CombineAnd(func1, func2, func3);
内容的提问来源于stack exchange,提问作者Anubhit
相关产品推荐
相关产品推荐

