.NET 4.x Неправильно работает string.compare() - C#
Формулировка задачи:
Доброго всем времени суток.
Столкнулся с проблемой - не могу решить.
Есть отсортированный файл:
Файл большой, поэтому использую бинарный поиск, чтобы найти нужную строку в файле.
Когда происходит сравнение строк
и в
...
11906550
11906560
11906561
11906565
11906570
12-66422
12-66423
12000000
12000001
12000050
12000070
...
System.IO.FileStream fs = new System.IO.FileStream(pathf, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read);
if (fs.CanSeek == true && fsize > 0) // если можно производить поиск
{
long LB = 0, UB = fsize;
while (true)
{
M = (LB + UB) / 2;
while (M % 128 != 0)
{
M++;
}
fs.Seek(M, SeekOrigin.Begin);
fs.Read(numberb, 0, 17);
snumberb = Encoding.GetEncoding(866).GetString(numberb).ToUpper().Trim();
fs.Seek(111, SeekOrigin.Current);
if (string.Compare(str, snumberb) < 0) // KEY < A[M]
{
UB = M - 128;
}
else
{
if (string.Compare(str, snumberb) > 0) // KEY > A[M]
{
LB = M + 128;
}
else
{
fs.Dispose(); // освобождаем ресурсы
return M + 17;
}
}
if (LB > UB)
{
fs.Dispose(); // освобождаем ресурсы
return -1;
}
}
}
return -1;if (string.Compare(str, snumberb) < 0) // KEY < A[M]
snumberb
мы имеем12-66422
, а вstr = 12000200
то С# говорит, что12-66422
больше чем12000200
. А файлик то отсортирован иначе, поэтому нижняя граница сдвигается вместо верхней и до12000200
мы уже никогда не дойдем - функция скажет что такой записи нет, хотя она есть! Вопрос: Как заставить C# думать, что12-66422
меньше чем12000200
?Решение задачи: «.NET 4.x Неправильно работает string.compare()»
textual
Листинг программы
if (string.CompareOrdinal(str, snumberb) < 0) // KEY < A[M]
{
UB = M - 128;
}
else
{
if (string.CompareOrdinal(str, snumberb) > 0) // KEY > A[M]
{
LB = M + 128;
}
else
{
fs.Dispose(); // освобождаем ресурсы
return M + 17;
}
}