我可以获得用于与CompareOptions进行比较的结果字符串吗

本文关键字:比较 结果 字符串 用于 CompareOptions 我可以 | 更新日期: 2023-09-27 17:58:36

我有自定义的IComparer<string>,我用它来比较字符串,忽略它们的大小写和像这样的符号:

public class LiberalStringComparer : IComparer<string>
{
    private readonly CompareInfo _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
    private const CompareOptions COMPARE_OPTIONS = CompareOptions.IgnoreSymbols | CompareOptions.OrdinalIgnoreCase;
    public int Compare(string x, string y)
    {
        if (x == null) return -1;
        if (y == null) return 1;
        return this._compareInfo.Compare(x, y, COMPARE_OPTIONS);
    }
}

我能获得最终用于比较的输出字符串吗?

我的最终目标是生成一个IEqualityComparer<string>,它以与此比较器相同的方式忽略符号和大小写。

我可以编写regex来实现这一点,但不能保证我的regex会使用与内置比较选项相同的逻辑。

我可以获得用于与CompareOptions进行比较的结果字符串吗

这里有一个非常有趣的问题。内部CompareInfo.Compare使用InternalCompareString方法从clr.dll:导入COMNlsInfo::InternalCompareString

// Compare a string using the native API calls -- COMNlsInfo::InternalCompareString   
...
private static extern int InternalCompareString(IntPtr handle, 
             IntPtr handleOrigin, String localeName, String string1, int offset1, 
             int length1, String string2, int offset2, int length2, int flags);

换句话说,由于您不能确定内置函数的逻辑,也许您应该编写自己的函数,并在IEqualityComparerIComparer实现中重用它。

可能没有这样的"输出字符串"。我会用这种方式实现你的Equals

return liberalStringComparer.Compare(x, y) == 0;

CCD_ 9更为复杂。

一些方法:

  1. 使用像return 0;这样糟糕的实现(这意味着您必须始终运行Compare才能知道它们是否相等)
  2. 由于比较相对简单(不变区域性、序数忽略大小写比较),因此应该能够生成一个通常有效的哈希。然而,如果没有对Unicode进行广泛的研究和测试,我不建议您认为这适用于任何文化中的任何有效Unicode字符串。

    在伪代码中:

    public int GetHashCode(string value)
    {
        // for each index in value
        if (!char.IsSymbol(value, i))
            // add value[i].ToUpperInvariant() to the hash using an algorithm
            // like http://stackoverflow.com/a/263416/781792
    }
    
  3. 通过移除char.IsSymboltrue的所有位置来形成字符串,然后在其上使用StringComparer.InvariantCulture.GetHashCode
  4. CompareInfo.GetSortKey的哈希代码应该是一个合适的值。

    public int GetHashCode(string value)
    {
        return _compareInfo.GetSortKey(value, COMPARE_OPTIONS).GetHashCode();
    }