如何使用纯LINQ(含Lambda)获取所有子列表的最大ID值?
纯LINQ实现获取所有Animal ID的全局最大值
嘿,先提个小细节:你当前的foreach循环代码其实有个逻辑问题——它每次迭代都会把max覆盖成当前Area下Animal ID的最大值,最后返回的只是最后一个Area里的最大ID,而不是所有Area下所有Animal的ID最大值。如果这不是你想要的结果,咱们用纯LINQ来修正并简化它:
最直观的方案:用SelectMany展平嵌套列表
SelectMany的作用就是把多层嵌套的列表“摊平”成一个单一序列,之后直接取最大值就好,这是最符合LINQ风格的写法:
int max = myZoo.AreaList .SelectMany(area => area.AnimalList) // 把所有Area里的Animal合并成一个大列表 .Select(animal => animal.ID) // 提取每个Animal的ID字段 .Max(); // 取全局最大值
嫌步骤多?可以把Select合并到SelectMany里,让代码更紧凑:
int max = myZoo.AreaList .SelectMany(area => area.AnimalList.Select(animal => animal.ID)) .Max();
优化:处理空列表的边界情况
如果你的AreaList可能为空,或者某个Area的AnimalList是空的,直接调用Max()会抛出InvalidOperationException。这时候可以加个DefaultIfEmpty来兜底:
// 当没有任何Animal时,返回0(你可以换成你需要的默认值) int max = myZoo.AreaList .SelectMany(area => area.AnimalList.Select(animal => animal.ID)) .DefaultIfEmpty(0) .Max();
或者用可空类型来处理,再做默认值转换,灵活性更高:
int? maxNullable = myZoo.AreaList .SelectMany(area => area.AnimalList.Select(animal => animal.ID)) .Max(); int max = maxNullable ?? 0; // 无数据时返回0,按需修改
这样写不仅完全用LINQ实现了需求,还修正了原代码的逻辑问题,同时考虑了空列表的异常情况~
内容的提问来源于stack exchange,提问作者Marcel Grüger
相关产品推荐
相关产品推荐

