在C#中比较字符串非常简单.事实上,有几种方法可以做到这一点.我在下面的块中列出了一些.我很好奇的是它们之间的差异以及何时应该使用其他的?是否应该不惜一切代价避免?还有更多我没有列出?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
Run Code Online (Sandbox Code Playgroud)
(注意:我在这个例子中寻找平等,不小于或大于,但也可以随意发表评论)
是否可以将字符串转换为序数大写或小写.类似于不变量.
string upperInvariant = "ß".ToUpperInvariant();
string lowerInvariant = "ß".ToLowerInvariant();
bool invariant = upperInvariant == lowerInvariant; // true
string upperOrdinal = "ß".ToUpperOrdinal(); // SS
string lowerOrdinal = "ß".ToLowerOrdinal(); // ss
bool ordinal = upperOrdinal == lowerOrdinal; // false
Run Code Online (Sandbox Code Playgroud)
如何实现ToUpperOrdinal和ToLowerOrdinal?
编辑:如何获取序数字符串表示?同样,如何获得不变的字符串表示?也许这是不可能的,因为在上述情况下它可能是模糊的,至少对于序数表示.
EDIT2:
string.Equals("ß", "ss", StringComparison.InvariantCultureIgnoreCase); // true
Run Code Online (Sandbox Code Playgroud)
但
"ß".ToLowerInvariant() == "ss"; // false
Run Code Online (Sandbox Code Playgroud) 我需要用德语比较两个字符串,以检查它们是否相等,只是在使用umlaute时有所不同.例如"Jörg"应与"Joerg"相同.
所以我尝试过:
var ci = new CultureInfo("de-DE");
int compareResult = ci.CompareInfo.Compare("jörg", "joerg", CompareOptions.IgnoreNonSpace);
Run Code Online (Sandbox Code Playgroud)
以及
int compareResult = String.Compare("jörg", "joerg", true, ci);
Run Code Online (Sandbox Code Playgroud)
(或者那两个是平等的吗?)
但是,这不起作用并将返回1.所有的变形金刚ö,ü和ä都是一样的.如果我比较strasse并straße以同样的方式,这确实有效并返回0?!
谢谢你的任何想法!这篇文章表明我应该工作.
我有一个带有 MVC 配置的 ASP.Net Core 项目。我使用 ASP.Net Core 版本 5.0\n我的母语是德语,因此我们的数据库也充满了德语单词,例如单词“fu\xc3\x9fball”(这意味着足球或足球,具体取决于您来自哪里) 。
\n正如您所看到的,这个单词有一个 \xc3\x9f。在德语中,这个“\xc3\x9f”基本上相当于“ss”。因此,如果我有字符串“fu\xc3\x9fball”,如果有人也搜索“fussball”,我希望能够找到它。
\n我知道 ASP.Net Core 具有良好的本地化和全球化选项,但我似乎无法弄清楚这一点。
\n考虑以下代码:
\nvar currCulture = CultureInfo.CurrentCulture.Name; // = "de-AT"\n\nvar str1 = "fu\xc3\x9fball";\nstr1.StartsWith("fuss"); //returns false\nstr1.StartsWith("fuss", StringComparison.InvariantCulture); //returns false\nString.Equals("\xc3\x9f", "ss", StringComparison.InvariantCulture); //returns false\n\nRun Code Online (Sandbox Code Playgroud)\n由于我使用英语语言的 Windows PC,并且我在另一个 Stackoverflow 问题中读到 CultureInfo 依赖于操作系统,因此我决定将以下内容插入到我的Startup.cs-File 中,正如此 Stackoverflow 问题中所建议的那样
var cultureInfo = new CultureInfo("de-AT"); //de-AT for Austria, i tried with de-DE too for germany, but the result was the same\ncultureInfo.NumberFormat.CurrencySymbol = "\xe2\x82\xac";\n\nCultureInfo.DefaultThreadCurrentCulture = …Run Code Online (Sandbox Code Playgroud) 根据维基百科,2017 年,使用大写字母\xe1\xba\x9e(Unicode U+1E9E) 被正式采用——至少作为一种选择——实际上可能是德语中全大写单词的子集:
同年 6 月,德国正字法委员会正式通过了一项规则,\xe2\x9f\xa8\xe1\xba\x9e\xe2\x9f\xa9 将成为 \xe2\x9f\xa8\xc3\x9f 大写的选项\xe2\x9f\xa9 除了之前的大写形式 \xe2\x9f\xa8SS\xe2\x9f\xa9 之外(即变体 STRASSE 和 STRA\xe1\xba\x9eE 将被视为同等有效)。2
\n似乎对德语的这一补充将大大简化字符串之间的大小写比较(所谓的“大小写折叠”或“折叠大小写”比较)。注意,我开始这个询问是为了理解 Raku(又名 Perl6)的实现,但实际上这个问题似乎可以推广到其他编程语言。这是 Raku 的默认实现 - 从rfdr_Regeln_2017.pdf中的 13 个单词开始,这些单词已小写(通过 Raku 的.lc函数):
~$ cat TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\nma\xc3\x9f stra\xc3\x9fe grie\xc3\x9f spie\xc3\x9f gro\xc3\x9f gr\xc3\xbc\xc3\x9fen au\xc3\x9fen au\xc3\x9fer drau\xc3\x9fen strau\xc3\x9f bei\xc3\x9fen flei\xc3\x9f hei\xc3\x9fen\n~$ raku -ne \'.words>>.match(/^ <:Ll>+ $/).say;\' TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\n(\xef\xbd\xa2ma\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2stra\xc3\x9fe\xef\xbd\xa3 \xef\xbd\xa2grie\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2spie\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2gro\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2gr\xc3\xbc\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2au\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2au\xc3\x9fer\xef\xbd\xa3 \xef\xbd\xa2drau\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2strau\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2bei\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2flei\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2hei\xc3\x9fen\xef\xbd\xa3)\n~$ raku -ne \'.uc.say;\' TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\nMASS STRASSE GRIESS …Run Code Online (Sandbox Code Playgroud)