如何用LINQ从对象列表的嵌套集合中筛选label=1的数据?
问题描述
现有如下结构的JSON数据,需要借助LINQ筛选出仅包含label=1的子数据,要求最终返回的结构与原数据完全一致——比如areaId=3的对象保留全部2条符合条件的data,areaId=4的对象只保留1条label=1的data。
原始数据:
[ { "_id": "", "at": "2022-11-19T10:00:00", "areaId": 3, "data": [ { "label": 1, "name": "a", "sec": 34, "x": 10.3, "y": 23.3 }, { "label": 1, "name": "a", "sec": 36, "x": 10.3, "y": 23.3 } ] }, { "_id": "", "at": "2022-11-19T10:01:00", "areaId": 4, "data": [ { "name": "a", "label": 1, "sec": 10, "x": 10.3, "y": 23.3 }, { "label": 2, "name": "b", "sec": 12, "x": 10.3, "y": 23.3 } ] } ]
实现方案
1. 定义对应实体类
首先需要在C#环境下定义与数据结构匹配的实体类,用于强类型处理:
// 子数据实体 public class ItemData { public int label { get; set; } public string name { get; set; } public int sec { get; set; } public double x { get; set; } public double y { get; set; } } // 父数据实体 public class AreaRecord { public string _id { get; set; } public DateTime at { get; set; } public int areaId { get; set; } public List<ItemData> data { get; set; } }
2. 编写LINQ筛选逻辑
通过LINQ遍历原始数据,对每个父对象的data集合进行过滤,同时保留其他属性不变:
// 假设原始数据已反序列化为List<AreaRecord> originalData var filteredData = originalData .Select(record => new AreaRecord { _id = record._id, at = record.at, areaId = record.areaId, // 仅保留data中label等于1的子项 data = record.data.Where(item => item.label == 1).ToList() }) // 可选:如果需要剔除过滤后data为空的父对象,取消下方注释 // .Where(record => record.data.Any()) .ToList();
这段代码的核心逻辑是:用Select重新构造每个父对象,复制除data外的所有属性,同时用Where筛选data集合中符合label=1的子项,最终返回结构与原数据完全一致的筛选结果。
内容的提问来源于stack exchange,提问作者Mehmet Serkan Ekinci
相关产品推荐
相关产品推荐

