使用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); } } }
代码说明
Select创建新Group:遍历每个原始Group,复制Id、Name等属性,同时替换Vehicles为过滤后的列表;Where(v => v.PlateNo.Contains("A0-")):真正对每个Group的车辆进行筛选;- 可选的
Where(grp => grp.Vehicles.Any()):如果某些Group在过滤后没有符合条件的车辆,可以用这行代码把它们排除掉。
运行这段代码后,你会看到每个Group只显示PlateNo包含"A0-"的车辆,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Omar Isaid
相关产品推荐
相关产品推荐

