You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:02:11