我有一个排序的字符串数组.给定一个标识前缀的字符串,我执行两次二进制搜索,找到数组中包含以该前缀开头的单词的第一个和最后一个位置:
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;
Run Code Online (Sandbox Code Playgroud)
运行此代码我得到firstPosition和lastPosition都等于1,而正确的答案是让lastPosition等于3(即指向第一个不匹配的单词).BinarySearch方法使用CompareTo方法来比较对象,我发现了
("abc"+char.MaxValue).CompareTo("abc")==0
Run Code Online (Sandbox Code Playgroud)
意思是两个字符串被认为是相等的!如果我改变代码
int lastPosition = Array.BinarySearch<string>(words, prefix + "z");
Run Code Online (Sandbox Code Playgroud)
我得到了正确的答案.而且我发现了
("abc"+char.MaxValue)==("abc")
Run Code Online (Sandbox Code Playgroud)
正确(关于我的需要)返回false.
你能帮我解释一下CompareTo方法的行为吗?
我希望CompareTo方法的行为类似于==,以便BinarySearch方法为lastPosition返回3.
c# ×1