如何优化阿拉伯数字转罗马数字转换器的重复代码与嵌套Switch?
优化阿拉伯数字转罗马数字的实现方案
你的代码通过嵌套switch处理不同位数的特殊值,导致逻辑大量重复。可以用统一映射表+递减遍历的方式彻底解决这个问题,代码会更简洁易维护。
优化思路
罗马数字的所有合法组合(包括4、9、40这类特殊值)都能整理成一组按数值从大到小排序的键值对。遍历这组键值对时,每次取当前数值能容纳的最大罗马值,拼接对应符号并减去该数值,循环直到原数减为0。这种方式无需区分个位/十位/百位,所有场景用同一套逻辑处理。
优化后的代码示例
// 定义所有罗马数字的数值-符号映射,按数值从大到小排序 private static readonly (int Value, string Symbol)[] RomanMappings = new[] { (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I") }; public string ConvertNumberToRoman(int val) { if (val < 1 || val > 3999) throw new ArgumentOutOfRangeException(nameof(val), "罗马数字仅支持1-3999的整数"); var result = new StringBuilder(); foreach (var (value, symbol) in RomanMappings) { while (val >= value) { result.Append(symbol); val -= value; } } return result.ToString(); }
方案优势
- 消除重复逻辑:无需分别处理不同位数的特殊值,所有情况用同一套遍历逻辑覆盖
- 代码更简洁:移除了嵌套switch、字符串解析数字等冗余操作
- 易维护:调整罗马数字规则时,仅需修改
RomanMappings数组,无需改动核心逻辑 - 性能更优:避免字符串转数字的开销,直接数值比较效率更高
内容的提问来源于stack exchange,提问作者Sam Allen
相关产品推荐
相关产品推荐

