字节数组比较最佳实践及多范围判断的if-else代码优化问询
字节数组比较最佳实践及多范围判断的if-else代码优化问询
我现在在做一个根据单个字符的Unicode字节范围匹配对应字体名称的功能,目前的实现是把字符转成Unicode字节数组后,通过一堆if-else判断字节数组落在哪个预设的范围区间里,进而返回对应的名称。但随着需要匹配的范围越来越多,if-else链变得越来越长,不仅代码可读性差,后续维护和扩展也很麻烦。
先贴一下我当前的实现代码:
private static string GetName(char str) { var d = ""; var bytes = System.Text.Encoding.Unicode.GetBytes(str.ToString()); if (IsSec(bytes, [00, 00], [00, 0xff])) { d = "latin"; } else if (IsSec(bytes, [0x01, 0x00], [0x02, 0x4f])) { d = "lating"; } else if (IsSec(bytes, [0x02, 0x50], [0x02, 0xaf]) || IsSec(bytes, [0x1d, 0x00], [0x1d, 0x8f])) { d = "s"; } else if (IsSec(bytes, [0x02, 0xb0], [0x02, 0xff]) || IsSec(bytes, [0xa7, 0x00], [0xa7, 0x1f])) { d = "df"; } else if (IsSec(bytes, [0x03, 0x00], [0x03, 0x6f]) || IsSec(bytes, [0x1d, 0xc0], [0x1d, 0xff])) { d = "df"; } else if (IsSec(bytes, [0x03, 0x70], [0x03, 0xff])) { d = "ssd"; } // ... 更多的if-else判断 return d; } private static bool IsSec(byte[] v, byte[] start, byte[] end) { if (BitConverter.IsLittleEndian) { Array.Reverse(v); Array.Reverse(start); Array.Reverse(end); } int v1 = BitConverter.ToInt32(v, 0); int start1 = BitConverter.ToInt32(start, 0); int end1 = BitConverter.ToInt32(end, 0); return v1 >= start1 && v1 <= end1; }
这里的IsSec方法是用来判断目标字节数组是否落在指定的起始-结束字节区间内,因为Unicode编码是小端模式,所以先做了字节反转处理,再转成int类型进行数值比较。
现在想请教大家:
- 有没有办法把这些范围规则配置化,比如用一个集合存储所有的「范围区间组-对应名称」的映射,然后通过循环遍历的方式匹配,替代冗长的
if-else链? - 对于这种多范围的区间判断,有没有更高效的实现方式,既能保证可读性,又能兼顾匹配效率?
- 另外,我注意到有些区间对应的名称是重复的(比如多个区间都返回"df"),有没有办法合并这些规则,减少冗余判断?




