如何将完整Lambda操作(非仅谓词)传入C#函数?
解决方案:灵活处理数据集的泛型GetData方法
你的核心问题是GetData方法的泛型委托定义不够明确,导致编译器无法推断如何将Lambda的结果转换为ListModel所需的int?类型。咱们直接调整代码,让它能灵活接收Count、Sum、过滤这类操作:
第一步:修正GetData方法的委托类型
把原来的泛型T2换成明确的Func<IList<DataModel>, int?>委托——这个委托的作用就是接收PrepareData返回的数据集,处理后返回一个int?(刚好匹配ListModel构造函数的参数)。修改后的GetData方法如下:
private void GetData(List<ListModel> targetList, Func<IList<DataModel>, int?> dataProcessor) { for (var i = 0; i < 12; i++) { var processedValue = dataProcessor(PrepareData(i)); targetList.Add(new ListModel(processedValue)); } }
第二步:调整构造函数中的调用逻辑
现在你可以直接传入完整的Lambda操作,注意处理空值场景(比如FirstOrDefault可能返回null):
public ViewModel(DataModel data) { _data = data; // 计数操作:直接返回集合的元素数量 GetData(CountItems, list => list.Count); // 求和操作:计算指定字段的总和(假设Data是int类型) GetData(SumItems, list => list.Sum(x => x.Data)); // 过滤操作:找到符合条件的第一个元素,安全获取Data字段,无匹配则返回null GetData(FilterItems, list => list.FirstOrDefault(x => x.Criteria == Value)?.Data); }
关键说明
- 明确委托类型:
Func<IList<DataModel>, int?>清晰定义了输入(PrepareData的返回值)和输出(ListModel需要的int?),编译器再也不会迷糊类型转换了。 - 空值安全处理:用
?.Data代替直接访问,避免FirstOrDefault返回null时抛出空引用异常,同时自然返回int?类型。 - 简化泛型参数:原来的T1、T2泛型参数完全没必要,直接用具体类型让代码更易读,减少类型推断错误。
这样修改后,GetData就能完美接收你需要的各种Lambda操作,不管是计数、求和还是过滤后的取值,都能灵活处理。
内容的提问来源于stack exchange,提问作者René Kåbis
相关产品推荐
相关产品推荐

