嵌套对象空值检查:使用SelectMany时避免空引用异常
解决Countries列表中Places空值引发的异常及退出逻辑问题
嘿,我来梳理下你遇到的问题和对应的优化方案:
首先你最开始尝试用SelectMany提取所有非null的Places时踩了坑——当x.Places为null时,你返回null给SelectMany,但这个方法不接受null的枚举对象,直接触发了空引用异常,这确实挺头疼的。
你后来调整了核心需求:如果所有国家都没有有效的Places(要么Places本身是null,要么所有Places集合都为空),就直接退出当前函数,并且已经写出了可行的代码,不过我可以给你提个小优化点:
优化后的实现方案
你原来的代码用lstAllPlaces.Count() == 0来判断是否为空,其实换成!lstAllPlaces.Any()会更高效,因为Any()不需要遍历整个集合,只要找到第一个元素就会停止判断,尤其是当集合数据量很大的时候,性能差异会更明显:
var lstAllPlaces = allPlacesDTO.World.Countries .Where(x => x.Places != null) .SelectMany(x => x.Places) .ToList(); if (!lstAllPlaces.Any()) { return; }
如果你想更精简,也可以直接把判断逻辑合并,不用提前把结果存入列表:
if (!allPlacesDTO.World.Countries .Where(x => x.Places != null) .SelectMany(x => x.Places) .Any()) { return; }
这样直接判断是否存在有效Places,符合你“没有有效数据就退出”的需求,代码也更紧凑。
额外补充(不同需求场景)
如果你的需求是只要有任意一个Country的Places为null就退出(和你当前需求不同,仅做场景补充),那代码应该改成这样:
if (allPlacesDTO.World.Countries.Any(x => x.Places == null)) { return; } var lstAllPlaces = allPlacesDTO.World.Countries .SelectMany(x => x.Places) .ToList();
不过根据你更新后的描述,你当前的需求是“所有国家都没有有效Places才退出”,所以你原来的实现逻辑是正确的,优化后的版本只是在性能和简洁性上做了提升~
内容的提问来源于stack exchange,提问作者Shaiju T
相关产品推荐
相关产品推荐

