使用LINQ获取各属性最大值时类型转换错误的解决方法
问题解决方法
错误原因很明确:MaxBy方法返回的是匿名类型的实例对象,但你的EnvironmentOccupiedAndRelativeHumidityFields记录的构造参数要求是double类型,类型不匹配导致报错。MaxBy的作用是找出集合中指定属性值最大的元素,而非直接返回该属性的最大值。
方案1:直接使用Max方法(推荐,代码更简洁高效)
不需要提前转换为匿名类型列表,直接对原集合的属性取最大值,同时保留空值转0的逻辑,还要处理空集合的边界情况:
public static EnvironmentOccupiedAndRelativeHumidityFields GetEnvironmentFields(IEnumerable<LibraryEnvironment> environments) { if (!environments.Any()) { return new EnvironmentOccupiedAndRelativeHumidityFields(0D, 0D, 0D); } return new EnvironmentOccupiedAndRelativeHumidityFields( environments.Max(l => l?.CoolingSetPointOccupied ?? 0D), environments.Max(l => l?.HeatingSetPointOccupied ?? 0D), environments.Max(l => l?.RelativeHumidityMax ?? 0D) ); }
方案2:保留匿名类型列表,修正MaxBy的使用
如果坚持使用原有的匿名类型列表,需要在MaxBy返回元素后,提取对应的属性值传入记录构造器,同时处理空列表的情况:
public static EnvironmentOccupiedAndRelativeHumidityFields GetEnvironmentFields(IEnumerable<LibraryEnvironment> environments) { var occupiedAndHumidityFieldValues = environments .Select(l => new { coolingSetPointOccupied = l?.CoolingSetPointOccupied ?? 0D, heatingSetPointOccupied = l?.HeatingSetPointOccupied ?? 0D, relativeHumidityMax = l?.RelativeHumidityMax ?? 0D }).ToList(); if (!occupiedAndHumidityFieldValues.Any()) { return new EnvironmentOccupiedAndRelativeHumidityFields(0D, 0D, 0D); } return new EnvironmentOccupiedAndRelativeHumidityFields( occupiedAndHumidityFieldValues.MaxBy(a => a.coolingSetPointOccupied).coolingSetPointOccupied, occupiedAndHumidityFieldValues.MaxBy(l => l.heatingSetPointOccupied).heatingSetPointOccupied, occupiedAndHumidityFieldValues.MaxBy(l => l.relativeHumidityMax).relativeHumidityMax ); }
关键注意事项
- 必须处理空集合的情况,否则
Max或MaxBy会抛出InvalidOperationException - 原代码中
l?.CoolingSetPointOccupied ?? 0D的空值处理逻辑是正确的,已经将l为null或属性本身为null的情况统一转为0
内容的提问来源于stack exchange,提问作者Glory Raj
相关产品推荐
相关产品推荐

