如何将含数组的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
相关产品推荐
相关产品推荐

