.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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д