gpt4 book ai didi

c# - 为什么 ("abc"+char.MaxValue).CompareTo ("abc")==0?

转载 作者:太空狗 更新时间:2023-10-29 22:23:18 24 4
gpt4 key购买 nike

我有一个排序的字符串数组。给定一个标识前缀的字符串,我执行两次二进制搜索以查找数组中包含以该前缀开头的单词的第一个和最后一个位置:

string [] words = {"aaa","abc","abcd","acd"};
string prefix = "abc";
int firstPosition = Array.BinarySearch<string>(words, prefix);
int lastPosition = Array.BinarySearch<string>(words, prefix + char.MaxValue);
if (firstPosition < 0)
firstPosition = ~firstPosition;
if (lastPosition < 0)
lastPosition = ~lastPosition;

运行这段代码,我得到 firstPosition 和 lastPosition 都等于 1,而正确的答案是 lastPosition 等于 3(即指向第一个不匹配的词)。BinarySearch 方法使用 CompareTo 方法比较对象,我发现

("abc"+char.MaxValue).CompareTo("abc")==0

意思是这两个字符串被认为是相等的!如果我用

更改代码
int lastPosition = Array.BinarySearch<string>(words, prefix + "z");

我得到了正确的答案。而且我发现

("abc"+char.MaxValue)==("abc")

正确(根据我的需要)返回 false。

你能帮我解释一下 CompareTo 方法的行为吗?

我希望 CompareTo 方法的行为类似于 ==,以便 BinarySearch 方法为 lastPosition 返回 3。

最佳答案

string.CompareTo() 进行当前文化比较。它在内部使用 StringComparer.CurrentCulture,而字符串等于运算符进行文化不变比较。

例如,如果当前文化是“DE”,你会得到与“ss”和“ß”相同的结果:

Console.WriteLine("ss".CompareTo("ß")); // => 0
Console.WriteLine("ss" == "ß"); // => false

你想要的是文化不变的比较,你将通过使用 StringComparer.Ordinal 获得:

StringComparer.Ordinal.Compare("ss", "ß"); // => -108
StringComparer.Ordinal.Compare("abc"+char.MaxValue, "abc"); // => 65535

关于c# - 为什么 ("abc"+char.MaxValue).CompareTo ("abc")==0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13471797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com