.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;
                            }
                        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы