Имя: Пароль:
1C
1С v8
Сравнение двух СтрокТекста
0 Csar
 
19.08.13
14:27
Всем привет. К моему удивлению пришлось обратиться сюда с вроде бы простым вопросом, ибо поиск на просторах интернета не дал результатов (видимо слишком простой вопрос).
Вопрос: Что представляет из себя сравнение двух строк текста? С равенством все понятно, а что означает следующая строка?:
Строка1, Строка2 - некие переменные строкового типа
Если Строка1 > Cтрока2 Тогда
...

Правильно ли я понимаю, что программа сначала смотрит на длину строки (если Длина(СТрока1)>Длина(Строка2) Тогда Истина), если Длины равны, то идет посимвольное сравнение по кодам символов? И если первый неодинаковый код символа у Строка1 > того же кода сивола у Строка2, то Истина?
1 Wobland
 
19.08.13
14:27
ищи лексическое сравнение (как-то так)
2 Starhan
 
19.08.13
14:28
(0) ты какой-то не тру 1сниг.
3 Csar
 
19.08.13
14:29
(2) поясни.
4 Csar
 
19.08.13
14:30
+ (0) или все же сравнение тут по количеству символов?
5 mikecool
 
19.08.13
14:30
(4) нет, не только
6 Starhan
 
19.08.13
14:30
(3)
Уже бы за пру минут сам проверил, все свои догадки.
7 Odavid
 
19.08.13
14:31
(3) 1С вообще не так работает, как привыкли программисты других языков.
И практика зачастую показывает, что в 1С реализуют наиболее худшие (но на скорую руку) алгоритмы.
8 Odavid
 
19.08.13
14:32
(5) ну и что болльше - "ВуХоДаСтР" или "вУхОдАсТр"??
9 Csar
 
19.08.13
14:34
(6) я все как то откладывал это) Видимо вопрос и впрямь нестандартный.
(1) с лексикой еще хуже в поисковиках)
10 mikecool
 
19.08.13
14:34
(8) мне пох
11 mikecool
 
19.08.13
14:35
"ВуХоДаСтР" > "вУхОдАсТр" = Истина
в табло за три секунды, лентяй
12 Odavid
 
19.08.13
14:35
(10)>> нет, не только
ljcnjqysq jndtn ^)
13 Odavid
 
19.08.13
14:36
(11) хорошо, и что это значит?
14 mikecool
 
19.08.13
14:41
(13) то и значит, что учитывается сравнение по кодам символов
15 Odavid
 
19.08.13
14:42
(14) и - логика сравнения? то бишь - практическое применение сравнения по кодам?
16 Starhan
 
19.08.13
14:43
да по кодам посимвольно сразу.
17 Csar
 
19.08.13
14:43
(14) значит внизу у меня мысля правильная в (0)?
18 Csar
 
19.08.13
14:44
ВуХоДаСтР > вУхОдАсТр
19 hhhh
 
19.08.13
14:45
(9) у 1с нету сравнения. Она берет его из SQL или из Windows, если файловая.
20 Csar
 
19.08.13
14:46
Провел исследование и оказалось, что моя мысль была правильной.
Сравнение разбивается на 2 этапа:
1) Сравнение по длине строки
2) Сравнение по кодам символов посимвольно
21 1Сергей
 
19.08.13
14:46
(20) длина строки не сравнивается
22 Starhan
 
19.08.13
14:46
(20) :) Скажи мне "В">"АБ"
23 MSII
 
19.08.13
14:48
(20) Только 2, поскольку включает в себя 1
24 Csar
 
19.08.13
14:49
(21) Сравнивается. Проверил
(22) Больше. В > АБ
25 1Сергей
 
19.08.13
14:50
(24) Просто, код символа конца строки = 0
26 Csar
 
19.08.13
14:50
(23) Не, я имел ввиду так:
Сравнивается код первого символа - если одинаковый, то переходим ко второму, иначе Возвращаем > или <
27 hhhh
 
19.08.13
14:50
(24) значит не сравнивается
28 Starhan
 
19.08.13
14:51
(24) не сравнивается. Просто при строках с одинаковым началом АБ и АБВ получается что В больше чем ничего.
29 Csar
 
19.08.13
14:51
(25) Да, похоже, что так. Значит только посимвольное сравнение
30 1Сергей
 
19.08.13
14:52
Аллилуйя!
31 Csar
 
19.08.13
14:53
Всем спасибо!
32 hhhh
 
19.08.13
14:53
(31) вообще-то это было 30 лет назад так. Теперь существуют алгоритмы сравнения, в которых свои правила для каждого языка, и от кодов символов не зависит.
33 hhhh
 
19.08.13
14:54
и то что вы вычислили для букв А, Б и В для других символов может и не так сравниваться.
34 Csar
 
19.08.13
14:55
(33) чисто из любопытства. Как сравнивается в другом каком-нибудь языке?
35 1Сергей
 
19.08.13
14:55
(33) ты это... нафига себе жизнь усложняешь? В 1С всё просто - посимвольное сравнение и всё.
36 Тролль главный
 
19.08.13
14:56
Почему отношение порядка строк не коррелирует с сортировками в запросах?
37 Csar
 
19.08.13
14:59
(36) я не понял вопроса
38 aka AMIGO
 
19.08.13
15:04
(35) угу.. только ВР() или НР() применить, да обрезать СокрЛП() :)
39 Odavid
 
19.08.13
15:05
(36) обычное чтение не коррелирует с реальным порядком хранения строк в базе.
Строки без сортировки могут читаться в любом порядке.
А вот с сортировкой порядок коррелирует напрямую - ибо сортировка и призвана хоть как-то упорядочить хаос "сырого" чтения из базы.
40 aka AMIGO
 
19.08.13
15:07
(39) строки читаются в порядке записи, или индекса, если он есть
41 Odavid
 
19.08.13
15:22
(40)>>строки читаются в порядке записи
так записи или индекса?
42 aka AMIGO
 
19.08.13
15:49
(41) ну, я-ж написал "или".. конкретного примера-то нет.. нельзя судить абстрактно.
Если это строковый реквизит в справочника, он может иметь индекс, а может и не иметь..
что имел в виду автор?
43 Odavid
 
19.08.13
15:59
(42)строки хранятся в БД не в порядке их записи. А в порядке, определенным оптимизатором.
И читаются тоже - как анализатор скажет.
44 Csar
 
19.08.13
16:08
Любопытно иногда читать как мысль ТС в топике перетекает в совершенно другое русло =)
45 Odavid
 
19.08.13
16:12
ТС -это вы )
46 Зойч
 
19.08.13
16:20
(43) если есть кластерный индекс то есть и порядок хранения
47 Odavid
 
19.08.13
16:24
(46) а причем тут кластерный индекс? Ну-ка, получите в 1С данные по кластреному индексу, давай-ка...
48 Зойч
 
19.08.13
16:27
(47) что значит "получить по кластерному индексу"???
49 Csar
 
19.08.13
16:35
(45) я попытался от третьего лица отметить ситуацию)
50 mikecool
 
19.08.13
16:37
(47) как бе субд выбирает данные из кластера, если он используется
51 Serginio1
 
19.08.13
16:54
private static unsafe int CompareOrdinalHelper(string strA, string strB)
{
    int num = Math.Min(strA.Length, strB.Length);
    int num2 = -1;
    fixed (char* chRef = &strA.m_firstChar)
    {
        fixed (char* chRef2 = &strB.m_firstChar)
        {
            char* chPtr = chRef;
            char* chPtr2 = chRef2;
            while (num >= 10)
            {
                if (*(((int*) chPtr)) != *(((int*) chPtr2)))
                {
                    num2 = 0;
                    break;
                }
                if (*(((int*) (chPtr + 2))) != *(((int*) (chPtr2 + 2))))
                {
                    num2 = 2;
                    break;
                }
                if (*(((int*) (chPtr + 4))) != *(((int*) (chPtr2 + 4))))
                {
                    num2 = 4;
                    break;
                }
                if (*(((int*) (chPtr + 6))) != *(((int*) (chPtr2 + 6))))
                {
                    num2 = 6;
                    break;
                }
                if (*(((int*) (chPtr + 8))) != *(((int*) (chPtr2 + 8))))
                {
                    num2 = 8;
                    break;
                }
                chPtr += 10;
                chPtr2 += 10;
                num -= 10;
            }
            if (num2 == -1)
            {
                goto Label_00F1;
            }
            chPtr += num2;
            chPtr2 += num2;
            int num3 = chPtr[0] - chPtr2[0];
            if (num3 != 0)
            {
                return num3;
            }
            return (chPtr[1] - chPtr2[1]);
        Label_00D7:
            if (*(((int*) chPtr)) != *(((int*) chPtr2)))
            {
                goto Label_00F5;
            }
            chPtr += 2;
            chPtr2 += 2;
            num -= 2;
        Label_00F1:
            if (num > 0)
            {
                goto Label_00D7;
            }
        Label_00F5:
            if (num > 0)
            {
                int num4 = chPtr[0] - chPtr2[0];
                if (num4 != 0)
                {
                    return num4;
                }
                return (chPtr[1] - chPtr2[1]);
            }
            return (strA.Length - strB.Length);
        }
    }
}
52 Odavid
 
19.08.13
17:03
(48)используйте его
(50)СУБД "следит" за базой по нему. Но не данные выдает в порядке кластерного индекса.
(51)и что? кластерный индекс невидим разработчикам и пользователям.