C# LinQ实现List<Model>中Sizes子列表的条件筛选
解决方法:保留所有Model,仅过滤子集合Sizes
这问题我太熟了!你要的是保留所有父Model对象,只对每个对象里的Sizes子列表做条件筛选——这和用All/Any过滤父对象完全不是一回事,用Linq的Select投影就能轻松实现。
先明确你的Model结构(整理后)
public class Model { public int ID { get; set; } public decimal Price{ get; set; } public string Address{ get; set; } public List<Characteristic> Characteristics{ get; set; } public List<Size> Sizes{ get; set; } } // 假设子类定义示例(你可以替换成自己的实际结构) public class Characteristic { /* 自定义属性 */ } public class Size { public int Width { get; set; } /* 其他属性 */ }
核心实现代码(推荐创建新集合,不修改原数据)
我们通过Select遍历每个Model,投影出一个新的Model对象,保留需要的属性,同时对Sizes做过滤:
// 替换这里的条件为你实际的筛选逻辑,比如 s => s.Width > 10 或 s => s.Name == "XL" var filteredModels = models.Select(model => new Model { ID = model.ID, Price = model.Price, Address = model.Address, // 直接保留原Characteristics列表,若需要深拷贝避免原集合修改影响新集合,可加?.ToList() Characteristics = model.Characteristics, // 关键:过滤Sizes子列表,?.避免原Sizes为null时的空引用异常 Sizes = model.Sizes?.Where(size => size.Width > 10).ToList() }).ToList();
可选方案:直接修改原集合(不推荐,易引发副作用)
如果你确实需要修改原Model对象的Sizes(而非创建新集合),可以用ForEach遍历处理:
models.ForEach(model => { if (model.Sizes != null) { // 替换为你的筛选条件 model.Sizes = model.Sizes.Where(size => size.Width > 10).ToList(); } });
注意事项
- 如果你使用EF等ORM框架,确保Sizes已经被预加载(比如用
Include(m => m.Sizes)),否则Where可能会触发额外的数据库查询 - 若需要深拷贝子集合(防止原集合后续修改影响新集合),将
Characteristics = model.Characteristics改为Characteristics = model.Characteristics?.ToList(),Sizes同理 - 筛选条件可以完全自定义,只要是针对
Size对象的布尔判断即可
内容的提问来源于stack exchange,提问作者HelpASisterOut
相关产品推荐
相关产品推荐

