如何用C# LINQ筛选含ABC开头分类的玩具并保留对应分类
解决方案
我们可以通过LINQ的组合方法快速实现需求,核心是先筛选出符合条件的玩具,再对其分类列表做过滤处理。
代码实现
var filteredToys = toys // 筛选出至少包含一个ABC开头分类的玩具 .Where(t => t.category.Any(c => c.Name.StartsWith("ABC", StringComparison.OrdinalIgnoreCase))) // 对每个符合条件的玩具,仅保留ABC开头的分类 .Select(t => new Toy { name = t.name, category = t.category.Where(c => c.Name.StartsWith("ABC", StringComparison.OrdinalIgnoreCase)).ToList() }) .ToList();
代码说明
- 筛选玩具:用
Where配合Any方法判断,只要玩具的分类列表里存在名称以"ABC"开头的项,就保留该玩具;StringComparison.OrdinalIgnoreCase用于忽略大小写匹配,不需要的话可以直接去掉。 - 过滤分类:通过
Select创建新的Toy对象,复制原玩具的名称,同时对分类列表再次过滤,只保留符合前缀要求的分类项。 - 结果验证:执行后
filteredToys仅包含teddy1,且它的分类列表只剩"ABC xxx"和"ABC zzz"两项。
可选修改方案(直接修改原对象)
如果允许修改原Toy对象的分类集合,也可以用以下方式:
var filteredToys = toys .Where(t => t.category.Any(c => c.Name.StartsWith("ABC"))) .ToList(); foreach (var toy in filteredToys) { toy.category = toy.category.Where(c => c.Name.StartsWith("ABC")).ToList(); }
内容的提问来源于stack exchange,提问作者O'Neil Tomlinson
相关产品推荐
相关产品推荐

