遍历IEnumerable按字段条件映射Model的Linq实现及foreach适用性咨询
你之前的写法存在两个核心问题:
GroupBy是用来将集合按指定键分组的方法,返回的是IGrouping类型的分组集合,不是单个实体,直接访问g.Field1必然语法报错- 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
相关产品推荐
相关产品推荐

