如何手动将Citizen对象列表映射为CitizenDTO列表?
如何将Citizen对象列表映射到CitizenDTO列表?
你已经写好了单个Citizen到CitizenDTO的扩展方法,其实用你提到的Select()就能直接实现列表的映射,非常简单!
直接复用现有扩展方法的写法
既然你已经有了ToDTO()这个扩展方法,只需要在IEnumerable<Citizen>集合上调用Select(),把每个元素传入你的扩展方法即可:
// 假设你有一个Citizen数据源 List<Citizen> citizenList = GetCitizensFromDataSource(); // 替换成你的实际数据源 // 映射为CitizenDTO的可枚举集合 IEnumerable<CitizenDTO> dtoEnumerable = citizenList.Select(citizen => citizen.ToDTO()); // 如果需要转为List<CitizenDTO>,直接追加ToList() List<CitizenDTO> dtoList = citizenList.Select(citizen => citizen.ToDTO()).ToList();
也可以直接在Select中编写映射逻辑(无需依赖扩展方法)
如果不想依赖已有的扩展方法,也可以直接在Select()的Lambda表达式里完成映射,逻辑和单个实例的映射完全一致:
IEnumerable<CitizenDTO> dtoList = citizenList.Select(citizen => citizen == null ? null : new CitizenDTO { Id = citizen.Id, Name = citizen.Name, Age = citizen.Age, HeadId = citizen.HeadId, HeadName = citizen.FamilyHead?.Name // 建议加空值运算符,避免FamilyHead为null时抛出异常 });
几个实用注意点
- 空值防护:如果你的
citizenList中可能存在null元素,记得在映射时做判断(你的扩展方法已经处理了单个citizen为null的情况,复用扩展方法的话无需额外处理) - 延迟执行特性:
Select()返回的IEnumerable<T>是延迟执行的,如果你需要立即生成具体集合(比如List<T>),记得调用ToList()或ToArray() - 导航属性加载:要确保
Citizen的FamilyHead导航属性已被正确加载(比如EF中使用Include(c => c.FamilyHead)),否则FamilyHead会为null,导致HeadName赋值时抛出空引用异常
内容的提问来源于stack exchange,提问作者Annahri
相关产品推荐
相关产品推荐

