如何使用Linq基于Key将列表中多值绑定到另一列表
问题描述
开发应用时收到如下格式的配置数据:
var dd = new List<ConfigurationItem> { new ConfigurationItem { Key = "Partners:JohnDeere:Manufacturers:0:ManufacturerIdentity", Value= "13" }, new ConfigurationItem { Key = "Partners:JohnDeere:Manufacturers:1:ManufacturerIdentity", Value= "14" }, new ConfigurationItem { Key = "Partners:JohnDeere:Manufacturers:0:SubmitLocator", Value= "True" }, new ConfigurationItem { Key = "Partners:JohnDeere:Manufacturers:1:SubmitLocator", Value= "True" }, };
需要将这些数据转换为ManufacturerOptions类型的列表,该类定义如下:
public class ManufacturerOptions { public int ManufacturerIdentity { get; set; } public int LocationIdentity { get; set; } public bool SubmitLocator { get; set; } public string WarehouseType { get; set; } public string WarehouseCode { get; set; } }
当前仅实现了ManufacturerIdentity的绑定,需要完成所有属性的映射。
解决方案
核心思路是先通过Key中的制造商索引值(比如Manufacturers:0:里的0)将同属一个制造商的配置项分组,再为每个分组构建完整的ManufacturerOptions对象。
实现代码如下:
// 按制造商索引分组,确保同个制造商的配置项归为一组 var groupedItems = dd.GroupBy(item => { var keyParts = item.Key.Split(':'); // 定位到Manufacturers段的下一位,也就是索引值 var manufacturerIndexPos = Array.IndexOf(keyParts, "Manufacturers") + 1; return keyParts[manufacturerIndexPos]; }); // 遍历分组,构建完整的ManufacturerOptions列表 _dataTransferFacilityOptions.Manufacturers = groupedItems.Select(group => { var options = new ManufacturerOptions(); foreach (var item in group) { var keyParts = item.Key.Split(':'); var propertyName = keyParts.Last(); var value = item.Value; // 匹配属性名并完成类型转换赋值 switch (propertyName) { case nameof(ManufacturerOptions.ManufacturerIdentity): options.ManufacturerIdentity = int.TryParse(value, out var id) ? id : 0; break; case nameof(ManufacturerOptions.SubmitLocator): options.SubmitLocator = bool.TryParse(value, out var submit) ? submit : false; break; case nameof(ManufacturerOptions.LocationIdentity): options.LocationIdentity = int.TryParse(value, out var locId) ? locId : 0; break; case nameof(ManufacturerOptions.WarehouseType): options.WarehouseType = value; break; case nameof(ManufacturerOptions.WarehouseCode): options.WarehouseCode = value; break; } } return options; }).ToList();
关键细节说明
- 分组逻辑:通过分割Key字符串定位到
Manufacturers后的索引值,以此作为分组依据,保证同一制造商的所有配置项不会分散。 - 安全类型转换:使用
TryParse替代直接Convert,避免因配置值格式错误导致的异常,同时设置默认值保证程序稳定性。 - 扩展性:后续新增属性时,只需在
switch分支中添加对应处理逻辑即可,无需修改核心分组逻辑。
内容的提问来源于stack exchange,提问作者Muhammad Kamran
相关产品推荐
相关产品推荐

