如何更优雅地将含type/value的对象列表映射为单个Person对象?
优雅转换PersonDataEntries列表为Person对象的方案
你的问题核心是多次重复遍历列表查询指定类型数据,既繁琐又影响性能,推荐先把列表转成字典来优化,只需要遍历一次列表,后续通过键值对快速查找:
优化步骤
- 先将列表转换为以
Type为键、Value为值的字典,仅遍历一次列表:
var dataDict = personDataEntriesList.ToDictionary(x => x.Type, x => x.Value);
- 通过字典直接取值构建Person对象,代码简洁且查找效率更高:
return new Person( FirstName: dataDict["firstname"], LastName: dataDict["lastname"], BirthDay: DateTime.Parse(dataDict["birthday"]) );
补充说明
- 原代码里的
Single()会在找不到对应Type时抛出InvalidOperationException,用字典索引器取值时,找不到对应键会抛出KeyNotFoundException,异常行为接近,保持了原有的严格校验逻辑。 - 如果需要兼容部分Type缺失的场景,可以用
TryGetValue做安全处理:
if (!dataDict.TryGetValue("firstname", out var firstName)) { // 这里可以赋值默认值,或者抛出自定义异常 firstName = string.Empty; }
内容的提问来源于stack exchange,提问作者heycaptain
相关产品推荐
相关产品推荐

