如何在JSON对象中循环查找指定PageId并找到后终止循环?
问题描述
我尝试从给定JSON中获取指定PageId的页面,虽已找到目标值,但因循环未停止,后续遍历无对应值的section时,page被设为null。请问获取目标页面并找到后终止循环的最优方法是什么?
现有代码
var pageId = 912; foreach(var section in SectionsObj) { page = section.Pages.Where(page => page.PageId == pageId).FirstOrDefault(); };
数据源JSON
{ "sections":[ { "sectionId":1, "sectionName":"xxx", "pages":[ { "pageId":910, "pageName":"Profile Page 1" }, { "pageId":911, "pageName":"Profile Page 2" } ] }, { "sectionId":2, "sectionName":"xx", "pages":[ { "pageId":912, "pageName":"Profile Page 1" }, { "pageId":913, "pageName":"Profile Page 2" } ] }, { "sectionId":3, "sectionName":"xxxx", "pages":[ { "pageId":914, "pageName":"Profile Page 1" }, { "pageId":915, "pageName":"Profile Page 2" } ] } ] }
解决方案
方法1:LINQ链式查询(最优方案)
通过SelectMany扁平化所有section下的pages集合,再用FirstOrDefault找到第一个匹配项,找到后自动停止遍历,代码简洁高效:
var pageId = 912; var targetPage = SectionsObj .SelectMany(section => section.Pages) .FirstOrDefault(page => page.PageId == pageId);
若确定PageId全局唯一,可替换为SingleOrDefault,它会在存在多个匹配项时抛出异常,适合数据唯一性有保障的场景。
方法2:foreach循环内判断终止
保留循环写法,找到目标页面后立即break跳出循环,避免后续无效遍历:
var pageId = 912; var targetPage = null; foreach(var section in SectionsObj) { targetPage = section.Pages.FirstOrDefault(page => page.PageId == pageId); if(targetPage != null) { break; } }
注意这里直接用FirstOrDefault替代Where(...).FirstOrDefault(),前者找到匹配项就停止遍历当前pages集合,比后者更高效。
内容的提问来源于stack exchange,提问作者user10860402
相关产品推荐
相关产品推荐

