Имя: Пароль:
1C
 
Свернуть список значений
0 MagTux
 
11.04.11
16:56
Доброго времени суток!
Я так понимаю, что не существует штатной процедуры свёртки списка значений (удаления дубликатов).
Я сворачиваю список так:

СП.Сортировать();
ТемпЗнач=СП.ПолучитьЗначение(1);
Для Н=2 по СП.РазмерСписка() цикл
 Попытка
   СПЗнач=СП.ПолучитьЗначение(Н);
 Исключение
   Прервать;
 КонецПопытки;
 Если СПЗнач=ТемпЗнач Тогда
   СП.УдалитьЗначение(Н);
   Н=Н-1;
 Иначе
   ТемпЗнач=СПЗнач;
 КонецЕсли;                
КонецЦикла;

На моём списке в 19111 символьных строк такая процедура отрабатывает 35 секунд, а если пользоваться таблицей значений с одной колонкой и процедурой Свернуть(), то свёртка продолжается 21 миллисекунду.

Существует ли такой же быстрый способ свернуть список не прибегая к использованию таблицы значений?
Спасибо!
1 andrewks
 
11.04.11
16:57
Заполнить()
Свернуть()
Выгрузить()
2 zak555
 
11.04.11
16:57
зачем попытка ?
3 andrewks
 
11.04.11
17:00
(2) ну как это! он в цикле удаляет эл-ты списка, а проход при этом использует _прямой_
4 MagTux
 
11.04.11
17:00
(2) Список то уменьшается. Можно использовать дополнительную переменную, но так вроде, лучше.
5 andrewks
 
11.04.11
17:00
(4) лучше кому?
6 Mikeware
 
11.04.11
17:01
(5) "не поможет"...
пропорция радиусов такова, что не поможет...
7 zak555
 
11.04.11
17:02
(4) удалить сзада ?
8 andrewks
 
11.04.11
17:03
(7) сзадУ :-)
а вообще - я уже ему сказал, как нормально - перегнать в ТЗ, свернуть и выгрузить
9 zak555
 
11.04.11
17:04
(8) так он опять в (1) будет использовать (2)
10 andrewks
 
11.04.11
17:07
СП.Сортировать();
Для нз=-СП.РазмерСписка() По -2 Цикл
   ТекЗнач=СП.ПолучитьЗначение(-нз);
   ПредЗнач=СП.ПолучитьЗначение(-нз+1);
   Если ТекЗнач=ПредЗнач Тогда
       СП.УдалитьЗначение(-нз);
   КонецЕсли;
КонецЦикла;
11 MagTux
 
11.04.11
17:08
(6) Нормальные радиусы.
(10) Спасибо, но через ТЗ всё-равно быстрее.
12 andrewks
 
11.04.11
17:08
(11) и?
13 Ёпрст
 
гуру
11.04.11
17:11
(11)

select * distinct from #врСписок
14 Lepochkin
 
12.04.11
11:01
Может проще на момент добавления проверить, а нет ли там этого значения методом Принадлежит()??? Лишних телодвижений делать не надо будет
15 Simod
 
12.04.11
11:41
// сз_СписокЗначений - твой список значений
// будет работать для сортированых и не сортированых списков, для сортированных быстрее

сз_Дубликат                = СоздатьОбъект("СписокЗначений");

п_КоличествоЗначений    = сз_СписокЗначений.РазмерСписка();

Если п_КоличествоЗначений > 1 Тогда
   
   п_Значение    = сз_СписокЗначений.ПолучитьЗначение(1);
   сз_Дубликат.ДобавитьЗначение(п_Значение);
   
   Для п_Позиция = 2 По п_КоличествоЗначений Цикл
       
       п_ТекЗначение    = сз_СписокЗначений.ПолучитьЗначение(п_Позиция);
       
       Если п_Значение <> п_ТекЗначение Тогда
           
           п_Значение    = п_ТекЗначение;
           
           Если сз_Дубликат.НайтиЗначение(п_Значение) = 0 Тогда
               сз_Дубликат.ДобавитьЗначение(п_Значение);
           КонецЕсли;
           
       КонецЕсли;
       
   КонецЦикла;
   
   сз_СписокЗначений    = сз_Дубликат;
   
КонецЕсли;
16 MagTux
 
12.04.11
13:14
(15) Такой вариант у меня отработал быстрее, чем (1).
Но если изначально пользоваться ТЗ вместо списка, то ТЗ всё-равно быстрее сворачивается. Вероятно, это из-за типизированных полей.
Умнее всего будет делать (14). Хотя не всегда возможно.
Спасибо всем!
17 segabuben
 
12.04.11
15:25
(0), (15) с ТаблицейЗначений завсегда быстрей. и кода немного совсем.