C# 使用Linq查询Address列表拆分有效与不完整邮寄地址
实现方案
Lambda 表达式实现(更推荐)
合格地址的判断规则为 addressline1、city、state、zip 四个字段均不为空/空白字符串,使用 string.IsNullOrWhiteSpace 做判断可覆盖用户输入空格的异常场景:
// 满足发货要求的有效地址列表 var validAddresses = customer .Where(addr => !string.IsNullOrWhiteSpace(addr.addressline1) && !string.IsNullOrWhiteSpace(addr.city) && !string.IsNullOrWhiteSpace(addr.state) && !string.IsNullOrWhiteSpace(addr.zip)) .ToList(); // 未填写完整的无效地址列表 var invalidAddresses = customer .Where(addr => string.IsNullOrWhiteSpace(addr.addressline1) || string.IsNullOrWhiteSpace(addr.city) || string.IsNullOrWhiteSpace(addr.state) || string.IsNullOrWhiteSpace(addr.zip)) .ToList();
如果列表数据量较大,不想遍历两次集合,可以用 ToLookup 实现一次遍历完成分组,性能更优:
var addressGroups = customer.ToLookup(addr => !string.IsNullOrWhiteSpace(addr.addressline1) && !string.IsNullOrWhiteSpace(addr.city) && !string.IsNullOrWhiteSpace(addr.state) && !string.IsNullOrWhiteSpace(addr.zip)); var validAddresses = addressGroups[true].ToList(); var invalidAddresses = addressGroups[false].ToList();
LINQ 查询语法实现
该写法更适合多表关联、多层嵌套分组/排序的复杂场景,当前简单过滤场景下代码量会更长:
var validAddresses = (from addr in customer where !string.IsNullOrWhiteSpace(addr.addressline1) && !string.IsNullOrWhiteSpace(addr.city) && !string.IsNullOrWhiteSpace(addr.state) && !string.IsNullOrWhiteSpace(addr.zip) select addr).ToList(); var invalidAddresses = (from addr in customer where string.IsNullOrWhiteSpace(addr.addressline1) || string.IsNullOrWhiteSpace(addr.city) || string.IsNullOrWhiteSpace(addr.state) || string.IsNullOrWhiteSpace(addr.zip) select addr).ToList();
Lambda 适用性说明
这个场景使用 Lambda 表达式非常合适:
- 需求仅为简单的条件过滤,Lambda 写法简洁紧凑,筛选逻辑直观可见
- 不需要额外的查询语法关键字,代码量更少,可读性没有损失
- 后续如果需要链式追加排序、字段投影等操作,Lambda 的链式写法也更方便维护
内容的提问来源于stack exchange,提问作者GettingStarted
相关产品推荐
相关产品推荐

