如何优雅过滤IEnumerable<object>:移除字符串属性含List<string>元素的对象
优雅的Linq过滤解决方案
嘿,我懂你想要摆脱繁琐循环、用更简洁方式实现过滤的需求——用Linq就能轻松搞定!
先明确下场景:假设你的自定义对象长这样(我先给个示例类,方便你对应自己的对象):
public class CustomItem { public string TargetProperty { get; set; } // 你要检查的字符串属性 // 其他自定义属性... }
你的原始集合是IEnumerable<CustomItem>,过滤列表是List<string> filterTerms,目标是移除所有TargetProperty包含filterTerms中任意值的对象。
替代循环的Linq方案
直接用Where结合Any的取反逻辑就能实现,代码非常简洁:
var filteredCollection = originalCollection .Where(item => !filterTerms.Any(term => item.TargetProperty.Contains(term)));
补充:忽略大小写的匹配
如果你的场景不需要区分大小写(比如"test"和"Test"视为相同),可以给Contains加上字符串比较参数:
var filteredCollection = originalCollection .Where(item => !filterTerms.Any(term => item.TargetProperty.Contains(term, StringComparison.OrdinalIgnoreCase)));
为什么这个方案更优雅?
- 采用声明式编程:你只需要描述“要保留什么样的对象”,而不用手动写循环、临时列表的操作逻辑
- 代码更紧凑易读,链式调用的结构清晰表达了过滤逻辑
- 不需要额外创建临时集合存储中间结果,Linq会延迟执行,性能也有保障
如果你的原始集合是JSON格式,只需要先把它反序列化成IEnumerable<CustomItem>(比如用Newtonsoft.Json或System.Text.Json),上面的代码就完全适用啦。
内容的提问来源于stack exchange,提问作者Jessie Cryer
相关产品推荐
相关产品推荐

