You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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();

关键细节说明

  1. 分组逻辑:通过分割Key字符串定位到Manufacturers后的索引值,以此作为分组依据,保证同一制造商的所有配置项不会分散。
  2. 安全类型转换:使用TryParse替代直接Convert,避免因配置值格式错误导致的异常,同时设置默认值保证程序稳定性。
  3. 扩展性:后续新增属性时,只需在switch分支中添加对应处理逻辑即可,无需修改核心分组逻辑。

内容的提问来源于stack exchange,提问作者Muhammad Kamran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:12:49