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