折叠盒可加快比较速度

问题描述 投票:0回答:3
"strasse".Equals("STRAße",StringComparison.InvariantCultureIgnoreCase)

返回 true。哪个是对的。不幸的是,当我将其中一个存储在 postgres 中时,它认为在进行不区分大小写的匹配时它们是不同的(例如,使用

~*
)。我也用citext测试过。

因此,一种解决方案是预先折叠案例,从而将这些值中的任意一个的

strasse
存储在另一列中。然后我可以索引并搜索匹配项。

我一直在寻找如何在 C# 中折叠大小写一段时间,但一直未能在 C# 中找到解决方案。显然,知识是存在的,因为它可以正确比较这些字符串,我只是找不到从哪里获取它。

一种解决方案是生成一个 perl 进程

perl -E "binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while (<>) { print fc }"
,将进程的 C# 端也设置为这些管道的 utf8,然后通过 perl 发送文本来折叠大小写。但一定有比这更好的方法。

c# case-folding
3个回答
0
投票

string.Normalize()
,它接受
NormalizationForm
参数。 Michael Kaplan 详细介绍了这一点。他声称它比
FoldStringW
做得更好。

但是,它不会将大小写标准化为上或下,它仅折叠为规范形式。我建议您事后申请

ToUpper
ToLower


0
投票

查看源代码,我最终发现大部分实现都在一组名为 CompareInfo 的类中。

您可以在 github.com/dotnet/runtime

找到这些内容

这让我看到了这个页面,它提供了 .net 文化内部运作的线索。 .NET全球化和ICU

似乎 dotnet 实际上完全依赖于本机库来完成除序数操作之外的所有操作。

我认为 .Net Framework 可能正在使用 Win32 的 NLS。为此,有一种看起来很有前途的 FoldStringW 方法。

对于 ICU,有 Case Mappings 的文档,我找到了 u_strFoldCase 方法。


0
投票

可能超出您的需要,但来自 Unicode 技术报告 #36

Unicode 属性 [NFKC_Casefold] 可用于获取组合的 案例折叠、规范化和删除默认可忽略的代码 积分。

这是在 .NET 的 ICU 库端口中实现的。调用看起来像这样: Icu.Normalization.Normalizer2.GetNFKCCasefoldInstance().Normalize(mystring)

一个很好的概述:
程序员应该了解案例的真相

© www.soinside.com 2019 - 2024. All rights reserved.