You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

字节数组比较最佳实践及多范围判断的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"),有没有办法合并这些规则,减少冗余判断?

火山引擎 最新活动