我可以获得用于与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会使用与内置比较选项相同的逻辑。
这里有一个非常有趣的问题。内部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);
换句话说,由于您不能确定内置函数的逻辑,也许您应该编写自己的函数,并在IEqualityComparer
和IComparer
实现中重用它。
可能没有这样的"输出字符串"。我会用这种方式实现你的Equals
:
return liberalStringComparer.Compare(x, y) == 0;
CCD_ 9更为复杂。
一些方法:
- 使用像
return 0;
这样糟糕的实现(这意味着您必须始终运行Compare
才能知道它们是否相等) 由于比较相对简单(不变区域性、序数忽略大小写比较),因此应该能够生成一个通常有效的哈希。然而,如果没有对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 }
- 通过移除
char.IsSymbol
是true
的所有位置来形成字符串,然后在其上使用StringComparer.InvariantCulture.GetHashCode
CompareInfo.GetSortKey
的哈希代码应该是一个合适的值。public int GetHashCode(string value) { return _compareInfo.GetSortKey(value, COMPARE_OPTIONS).GetHashCode(); }