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

遍历IEnumerable按字段条件映射Model的Linq实现及foreach适用性咨询

你之前的写法存在两个核心问题:

  1. GroupBy 是用来将集合按指定键分组的方法,返回的是 IGrouping 类型的分组集合,不是单个实体,直接访问 g.Field1 必然语法报错
  2. Linq 不支持你写的 else 拼接多个 GroupBy 的语法,你的场景不需要分组,只需要对每个元素单独做条件判断后构造 Model 即可。

Linq 写法

C# 8.0 及以上版本推荐用更简洁的 switch 表达式实现:

return entities.Select(e => e.SpecifiedField switch
{
    "a" => new Model(e.Field1, e.Field2, e.Field3),
    "b" => new Model(e.Field4, e.Field5, e.Field6),
    "c" => new Model(e.Field7, e.Field8, e.Field9),
    // 可根据需求补充默认分支,比如返回默认Model或者抛出异常
    _ => throw new NotSupportedException($"不支持的字段值:{e.SpecifiedField}")
});

如果是低版本C#不支持switch表达式,可以用三元运算符实现:

return entities.Select(e => 
    e.SpecifiedField == "a" ? new Model(e.Field1, e.Field2, e.Field3) :
    e.SpecifiedField == "b" ? new Model(e.Field4, e.Field5, e.Field6) :
    e.SpecifiedField == "c" ? new Model(e.Field7, e.Field8, e.Field9) :
    throw new NotSupportedException($"不支持的字段值:{e.SpecifiedField}")
);

foreach 写法

数百条数据的场景用foreach完全合适,性能和Linq没有可感知的差异,而且如果后续需要补充日志、校验等额外逻辑,foreach的扩展性更好:

var models = new List<Model>();
foreach (var entity in entities)
{
    Model model = entity.SpecifiedField switch
    {
        "a" => new Model(entity.Field1, entity.Field2, entity.Field3),
        "b" => new Model(entity.Field4, entity.Field5, entity.Field6),
        "c" => new Model(entity.Field7, entity.Field8, entity.Field9),
        _ => throw new NotSupportedException($"不支持的字段值:{entity.SpecifiedField}")
    };
    models.Add(model);
}
return models;

性能说明

数百条数据的量级下,不管用Linq还是foreach都没有性能问题,Linq底层也是遍历集合做映射,额外开销可以忽略。你可以根据团队的编码习惯和后续逻辑扩展需求选择实现方式即可。

内容的提问来源于stack exchange,提问作者Noelia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:45:02