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

如何用LINQ从分组后的JArray中提取指定行?

解决JArray分组后过滤sectionGroup为null的行问题

你当前的问题是误用了Select方法——Select是用来转换元素的,所以你得到的是一组布尔值(每个元素对应是否满足条件)。要筛选出符合条件的行本身,应该用Where方法,它会直接返回满足条件的JToken对象(也就是你要的“行列表”)。

修正后的代码示例

public Task<JArray> JLogData(JArray jArray)
{
    var groupData = jArray.GroupBy(g => new 
    { 
        modelName = g["modelName"], 
        nlpModelVersion = g["nlpModelVersion"], 
        docId = g["docId"] 
    });

    // 收集所有分组中sectionGroup为null的行
    var allNullSectionRows = new List<JToken>();

    foreach (var group in groupData)
    {
        // 筛选当前分组中sectionGroup为null的行
        var nullSectionRows = group.Where(x => x["sectionGroup"] == null);
        // 如果要处理sectionGroup存在但值为null的情况,可改用:
        // var nullSectionRows = group.Where(x => x["sectionGroup"]?.Type == JTokenType.Null);
        
        allNullSectionRows.AddRange(nullSectionRows);
    }

    // 将收集到的行转为JArray返回
    return Task.FromResult(new JArray(allNullSectionRows));
}

关键说明

  • Where方法:遍历分组内的每个元素,只保留满足x["sectionGroup"] == null条件的元素,返回的是IEnumerable<JToken>,也就是你需要的行集合。
  • 关于JToken的null判断:
    • x["sectionGroup"] == null:表示该元素不存在sectionGroup属性。
    • 如果要处理“sectionGroup属性存在但值为null”的情况,用x["sectionGroup"]?.Type == JTokenType.Null更准确。
  • 返回值处理:因为方法声明返回Task<JArray>,所以用Task.FromResult包装最终的JArray对象即可;如果后续有异步操作,可改为async Task<JArray>并使用await。

内容的提问来源于stack exchange,提问作者tt0206

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:24:54