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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:27:26