【发布时间】:2010-06-07 09:37:27
【问题描述】:
我正在编写一个 c# 应用程序,它将处理一些文本并提供基本的查询功能。为了确保对其他语言的最佳支持,我允许应用程序的用户指定 System.Globalization.CultureInfo(通过“en-GB”样式代码)以及使用系统的全部排序选项.Globalization.CompareOptions 标志枚举。
对于常规字符串比较,我使用以下组合:
a) 接受区域性和选项的 String.Compare 重载
b) 对于一些批量进程,我正在缓存来自 CompareInfo.GetSortKey 的字节数据 (KeyData)(接受选项的重载)并使用 KeyData 的逐字节比较。
这看起来不错(尽管如果您认为这两种方法不应该混合使用,请发表评论),但后来我有理由使用 HashSet 类,它只有 IEqualityComparer 的重载。
MS 文档似乎建议我应该使用 StringComparer(它同时实现 IEqualityComparer 和 IComparer),但这似乎只支持 CompareOptions 中的“IgnoreCase”选项,而不支持“IgnoreKanaType”、“IgnoreSymbols”、“忽略宽度”等。
我假设忽略这些其他选项的 StringComparer 可以为使用我的其他比较选项可能被认为相同的两个字符串生成不同的哈希码。因此,我会从我的申请中得到不正确的结果。
目前只想创建我自己的 IEqualityComparer,它从 SortKey.KeyData 生成哈希码并使用 String.Compare 重载比较 eqality。
有什么建议吗?
【问题讨论】: