如何用LINQ替代foreach循环按属性值筛选JToken?
LINQ替代嵌套foreach筛选Capture Manager的POC数据方案
前提假设(匹配常见嵌套JSON结构)
假设你的JSON结构为多层嵌套:顶级是项目列表,每个项目下包含POC人员列表,每个POC包含Role字段。我们先定义对应实体类(无需修改JSON结构,仅用于反序列化):
// 实体类需与JSON结构严格对应 public class Project { public string ProjectId { get; set; } public List<PocItem> PocList { get; set; } } public class PocItem { public string Name { get; set; } public string Role { get; set; } public string Email { get; set; } }
1. 基于实体类的LINQ实现
先将JSON反序列化为实体集合(以Newtonsoft.Json为例),再用SelectMany扁平化嵌套集合,结合Where筛选目标数据:
// 反序列化JSON到实体集合 var projects = JsonConvert.DeserializeObject<List<Project>>(jsonContent); // LINQ筛选Role为Capture Manager的POC var targetPocs = projects .SelectMany(proj => proj.PocList) // 把所有项目下的POC列表合并为一个扁平集合 .Where(poc => poc.Role.Equals("Capture Manager", StringComparison.OrdinalIgnoreCase)) // 忽略大小写匹配 .ToList();
2. 无实体类的直接JToken操作(适合临时场景)
如果不想定义实体类,可直接用JToken解析JSON并筛选:
using Newtonsoft.Json.Linq; var root = JObject.Parse(jsonContent); var targetPocs = root["Projects"] // 定位到顶级项目数组节点 .SelectMany(proj => proj["PocList"]) // 扁平化POC列表 .Where(poc => poc["Role"].Value<string>() == "Capture Manager") .Select(poc => new { Name = poc["Name"].Value<string>(), Email = poc["Email"].Value<string>() }) // 提取需要的字段 .ToList();
核心逻辑说明
SelectMany是替代嵌套foreach的关键:它能将多层嵌套的集合"拍平"为单层集合,避免多层循环嵌套。- 若JSON嵌套层级更多(比如先有部门,再到项目,再到POC),只需多叠加一层
SelectMany即可,例如:var targetPocs = departments .SelectMany(dept => dept.Projects) .SelectMany(proj => proj.PocList) .Where(poc => poc.Role == "Capture Manager") .ToList();
内容的提问来源于stack exchange,提问作者Jesse Q
相关产品推荐
相关产品推荐

