C#中实现类似Excel VLOOKUP的区间匹配查询方法
实现方案:用内存数据集合+查询逻辑替代IF/Else
核心思路
把Excel里的区间映射数据转换成C#的内存数据结构,通过集合查询匹配HP对应的区间,完全不用嵌套IF/Else,也不需要依赖Excel程序。
步骤1:定义数据模型
先创建一个类对应Excel的每一行数据,存储区间上下限和空间系数:
public class MotorSpaceMapping { public double LowHP { get; set; } public double HighHP { get; set; } public double SpaceFactor { get; set; } }
步骤2:预加载数据
把Excel里的所有行数据整理成List<MotorSpaceMapping>,可以在窗体初始化时加载(如果需要动态更新,也可以用NPOI/EPPlus这类轻量库读取Excel文件到内存,全程不用启动Excel):
// 示例:直接把Excel数据写死到集合,或通过文件读取填充 private readonly List<MotorSpaceMapping> _motorSpaceData = new List<MotorSpaceMapping> { new MotorSpaceMapping { LowHP = 0.5, HighHP = 1.0, SpaceFactor = 0.8 }, new MotorSpaceMapping { LowHP = 1.0, HighHP = 2.0, SpaceFactor = 1.2 }, new MotorSpaceMapping { LowHP = 2.0, HighHP = 5.0, SpaceFactor = 1.5 }, // 补充其他区间数据... };
步骤3:实现查询方法
用LINQ直接查询符合区间的项,返回对应空间系数:
public double GetSpaceFactor(double hp) { // 根据需求调整区间边界逻辑,比如是否包含HighHP var match = _motorSpaceData.FirstOrDefault(m => hp >= m.LowHP && hp < m.HighHP); // 处理HP不在任何区间的情况,可返回默认值或抛出异常 if (match == null) { throw new ArgumentOutOfRangeException(nameof(hp), "HP值不在已知区间范围内"); // 或者返回默认值:return 0; } return match.SpaceFactor; }
优化:大数据量用二分查找
如果区间数据量很大(比如上百条),先给集合按LowHP排序,再用二分查找提升效率:
// 初始化时先排序 _motorSpaceData.Sort((a, b) => a.LowHP.CompareTo(b.LowHP)); // 二分查找实现 public double GetSpaceFactorFast(double hp) { int left = 0; int right = _motorSpaceData.Count - 1; while (left <= right) { int mid = (left + right) / 2; var current = _motorSpaceData[mid]; if (hp >= current.LowHP && hp < current.HighHP) { return current.SpaceFactor; } else if (hp < current.LowHP) { right = mid - 1; } else { left = mid + 1; } } throw new ArgumentOutOfRangeException(nameof(hp), "HP值不在已知区间范围内"); }
内容的提问来源于stack exchange,提问作者Brandon G
相关产品推荐
相关产品推荐

