Показать сообщение отдельно
Старый 21.04.2009, 10:37   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Повозился. Интересно. Автору - респект за раскопки! Когда я начинал изучать классы-коллекции, то метод create выглядел очень заманчиво, но быстро понял, что это не совсем то, что хотелось (а хотелось именно при инициализации в той же строке хвост значений прописать)... Но оказывается, всё-таки, это именно ТО! Нужно было только дотумкать до структуры контейнера

Имею некоторые дополнения. В ходе возни первым делом проверил обеспечение уникальности Set. Обеспечивается! И без ругани. Если мы возьмем для Set контейнер (ту часть, которая собственно данные) вида ['Mum','washed','Mum','frame'], то после загрузки Set, как и должно, будет содержать 3 уникальных элемента в отсортированном виде: {'frame','Mum','washed'}.
X++:
static void Check_SetUnique(Args _args)
{
    Set setByInit10 = Set::create( [ 1, any2int(Types::String), 10] 
                                   + ['Mum','washed','Mum','frame']) ; 
                                   // данные не уникальны!
    Set setByInit3  = Set::create( [ 1, any2int(Types::String), 3 ] 
                                   + ['Mum','washed','Mum','frame']) ;
    ;
    info(strFmt('setByInit10 : %1', setByInit10.toString()));
    info(strFmt('setByInit10.elements = %1', setByInit10.elements()));

    info(strFmt('setByInit3  : %1', setByInit3 .toString()));
    info(strFmt('setByInit3.elements = %1', setByInit3.elements()));
}
Код:
ИНФОЛОГ:

setByInit10 : {"frame", "Mum", "washed"}
setByInit10.elements = 3
setByInit3  : {"Mum", "washed"}
setByInit3.elements = 2
Еще обратите внимание на количество элементов в заголовке. Оказывается, не нужно скрупулезно считать, сколько элементов содержится в контейнере перед инициализацией, достаточно указать какое-нибудь заведомо большее число (см. setByInit10). Это число элементов - set.elements() - после инициализации будет правильно пересчитано по факту.

Но если длина контейнера данных указана меньше необходимой, что вначале будет отобрано заданное кол-во элементов (без проверки на уникальность! просто последовательно "слева направо"!), затем будут отброшены дубликаты и наконец выполнена сортировка - см. setByInit3, которое, несмотря на казалось бы дозволенность трех элементов, содержит их только два.