You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将完整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);
}

关键说明

  1. 明确委托类型:Func<IList<DataModel>, int?>清晰定义了输入(PrepareData的返回值)和输出(ListModel需要的int?),编译器再也不会迷糊类型转换了。
  2. 空值安全处理:用?.Data代替直接访问,避免FirstOrDefault返回null时抛出空引用异常,同时自然返回int?类型。
  3. 简化泛型参数:原来的T1、T2泛型参数完全没必要,直接用具体类型让代码更易读,减少类型推断错误。

这样修改后,GetData就能完美接收你需要的各种Lambda操作,不管是计数、求和还是过滤后的取值,都能灵活处理。

内容的提问来源于stack exchange,提问作者René Kåbis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:21