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

如何将含数组的EquipmentFilterPack映射为EquipmentListFilter列表?

问题描述

我定义了以下C#类:

public class EquipmentListFilter
{
    public string ColumnName { get; set; }
    public string Keyword { get; set; }
    public string Operand { get; set; }
    public string FilterType { get; set; }
}

public class EquipmentFilterPack
{
    public string[] ColumnNames { get; set; }
    public string[] keywords { get; set; }
    public string[] FilterTypes { get; set; }
    public string[] Operands { get; set; }
}

我的API接收EquipmentFilterPack对象作为输入,需要将其映射为List<EquipmentListFilter>类型的列表,示例结果如下:

[
    {
        ColumnName = "C1",
        Keyword = "kw1",
        Operand = "AND",
        FilterType = "IS"
    },
    {
        ColumnName = "C2",
        Keyword = "kw2",
        Operand = "AND",
        FilterType = "IS NOT"
    },
    ...
]

请问如何生成该目标列表?是否有LINQ实现方案?


实现方案

可以用LINQ实现,核心是按索引将多个数组的元素一一配对,映射为目标对象。同时要处理数组null、长度不一致的情况,避免异常。

1. LINQ实现(推荐)

通过Enumerable.Range生成索引序列,再按索引从各数组中取值,最后组装成对象:

public static List<EquipmentListFilter> ConvertPackToFilters(EquipmentFilterPack pack)
{
    // 处理null数组,转为空数组避免空引用
    var columns = pack.ColumnNames ?? Array.Empty<string>();
    var keywords = pack.keywords ?? Array.Empty<string>();
    var filterTypes = pack.FilterTypes ?? Array.Empty<string>();
    var operands = pack.Operands ?? Array.Empty<string>();

    // 取最短数组的长度作为循环上限,防止索引越界
    var validCount = new[] { columns.Length, keywords.Length, filterTypes.Length, operands.Length }.Min();

    return Enumerable.Range(0, validCount)
        .Select(index => new EquipmentListFilter
        {
            ColumnName = columns[index],
            Keyword = keywords[index],
            FilterType = filterTypes[index],
            Operand = operands[index]
        })
        .ToList();
}

2. 循环实现(更直观)

如果偏好传统写法,用普通循环也能达到同样效果:

public static List<EquipmentListFilter> ConvertPackToFilters(EquipmentFilterPack pack)
{
    var filters = new List<EquipmentListFilter>();
    if (pack == null) return filters;

    var columns = pack.ColumnNames ?? Array.Empty<string>();
    var keywords = pack.keywords ?? Array.Empty<string>();
    var filterTypes = pack.FilterTypes ?? Array.Empty<string>();
    var operands = pack.Operands ?? Array.Empty<string>();

    var validCount = new[] { columns.Length, keywords.Length, filterTypes.Length, operands.Length }.Min();

    for (int i = 0; i < validCount; i++)
    {
        filters.Add(new EquipmentListFilter
        {
            ColumnName = columns[i],
            Keyword = keywords[i],
            FilterType = filterTypes[i],
            Operand = operands[i]
        });
    }

    return filters;
}

额外提示

  • 如果业务允许部分字段为空,可以给默认值,比如Operand = operands.ElementAtOrDefault(i) ?? "AND"
  • 若需要严格校验数组长度一致,可以在开头判断,不一致则抛出异常或返回错误

内容的提问来源于stack exchange,提问作者Alex Wright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:45:45