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

使用LINQ Any运算符过滤集合内子集合失效问题求助

问题分析与解决方案

我来帮你搞定这个问题!你现在的核心问题是:你的LINQ查询只是筛选出了包含至少一辆符合条件车辆的Group,但并没有真正过滤每个Group内部的Vehicles子列表——所以每个Group里依然保留了所有原始车辆,并没有按PlateNo筛选。

为什么你的代码没生效?

你的这段代码:

var filtered = lstGrps
    .Where(s => s.Vehicles.Any(vehicle => vehicle.PlateNo.Contains("A0-")))
    .GroupBy(p=>p.Name);
  • Where的作用是:只保留那些存在符合条件车辆的Group,但它不会修改Group内部的Vehicles集合;
  • 后面的GroupBy和SelectMany其实是多余的,反而把简单的问题复杂化了,最终得到的还是原始的Group对象(Vehicles未被过滤)。

正确的解决方案

我们需要对每个Group的Vehicles子列表单独进行过滤,同时保留Group的其他属性。因为Group是引用类型,建议创建新的Group实例(避免修改原列表中的对象),代码如下:

修改后的完整Main方法

static void Main(string[] args)
{
    Seed seed = new Seed();
    List<Group> lstGrps = seed.SeedGroupsVehicles();

    // 正确的LINQ查询:过滤每个Group内的Vehicles
    var filteredGroups = lstGrps
        .Select(grp => new Group
        {
            Id = grp.Id,
            Name = grp.Name,
            // 只保留PlateNo包含"A0-"的车辆
            Vehicles = grp.Vehicles.Where(v => v.PlateNo.Contains("A0-")).ToList()
        })
        // 可选:如果想排除过滤后没有车辆的Group,添加这一行
        .Where(grp => grp.Vehicles.Any());

    // 打印过滤结果
    foreach (var grp in filteredGroups)
    {
        Console.WriteLine(" Group {0} {1}", grp.Id, grp.Name);
        foreach (var vehicle in grp.Vehicles)
        {
            Console.WriteLine("\tVehicle {0} {1} {2}", vehicle.Id, vehicle.Name, vehicle.PlateNo);
        }
    }
}

代码说明

  1. Select创建新Group:遍历每个原始Group,复制Id、Name等属性,同时替换Vehicles为过滤后的列表;
  2. Where(v => v.PlateNo.Contains("A0-")):真正对每个Group的车辆进行筛选;
  3. 可选的Where(grp => grp.Vehicles.Any()):如果某些Group在过滤后没有符合条件的车辆,可以用这行代码把它们排除掉。

运行这段代码后,你会看到每个Group只显示PlateNo包含"A0-"的车辆,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:36:42