如何用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
相关产品推荐
相关产品推荐

