29.10.2007, 19:02 | #1 |
Участник
|
Не создается экземпляр MapIterator
День добрый всем. Есть inqMap = new map(Types::Integer,Types::Container);
есть такая строка: MapIterator it = new MapIterator(inqMap); После чего it = null, т.е. ничего не проинициализировалось. В мапе есть 2-е записи. В чем проблема не пойму. P.S. AX 4.0. SP 2 |
|
29.10.2007, 19:10 | #2 |
Участник
|
X++: MapEnumerator me; ; me = inqMap.getEnumerator(); И вот еще полезно: А почему, кстати Enumerator лучше Iterator?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 Последний раз редактировалось Alex_KD; 29.10.2007 в 19:16. |
|
29.10.2007, 19:16 | #3 |
Участник
|
[quote=Alex_KD;151900]
X++: MapEnumerator me; ; me = inqMap.getEnumerator(); me = Unknown |
|
29.10.2007, 19:18 | #4 |
Участник
|
[quote=greench;151901]А полный код посмотреть можно?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.10.2007, 19:25 | #5 |
Участник
|
Полный код чего? заполнения мапы ? так это много и надолго. Приводить здесь код 2-х классов какой смысл. А если просто кусок кода где вставляются значения в мап, то я думаю вряд ли это поможет.
|
|
29.10.2007, 19:34 | #6 |
Участник
|
Код:
X++: Map m = new Map(Types::Integer, Types::Container); MapEnumerator me; container c; ; m.insert(1, ["First",1,1]); m.insert(2, ["Second",2,2]); m.insert(3, ["Third",3,3]); me = m.getEnumerator(); while(me.moveNext()) { c = me.currentValue(); info(conpeek(c, 1)); } Код: Info Message (19:33:51) First Info Message (19:33:51) Second Info Message (19:33:51) Third
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.10.2007, 23:21 | #7 |
Участник
|
До того, как итератор (или энумератор) не перейдут на первое значение (next или moveNext), значение текущего элемента (именно это показывает метод toString() этих классов) не известно.
|
|
30.10.2007, 10:17 | #8 |
SAP
|
Цитата:
После чего it = null, т.е. ничего не проинициализировалось. В мапе есть 2-е записи.
В чем проблема не пойму. |
|
30.10.2007, 10:24 | #9 |
Moderator
|
Цитата:
у меня такое предчувствие что вы не правильно передаете MAP с клиента на сервер. Поэтому то он и пустой (это так догадки, самая распространенная ошибка).
|
|
30.10.2007, 11:18 | #10 |
MCT
|
Читал о следующем
Цитата:
Вы можете пересчитывать ваши коллекции с помощью либо enumerator либо iterator. Когда классы коллекции были впервые представлены в Dynamics AX, iterator это была единственная опция. Но по причине hard-to-find ошибок, был добавлен enumerators, а iterators сохранился для дальнейшей совместимости. Для выявления этих различий, приведен следующий код для пересчета обоими способами.
X++: List list = new List(Types::Integer); ListIterator iterator; ListEnumerator enumerator; ; //Populate list. ... //Traverse using an iterator. iterator = new ListIterator(list); while (iterator.more()) { print iterator.value(); iterator.next(); } //Traverse using an enumerator. enumerator = list.getEnumerator(); while (enumerator.moveNext()) { print enumerator.current(); } Примечание В предыдущих версиях Dynamics AX, эта проблема была более явной так как разработка и тестирование могло происходить в двух уровневой архитектуре, а эта проблема появляется только в трех уровневой архитектуре. Второе отличие между iterators и enumerators это путь, по которому происходит сам пересчет. При использовании iterator, вы должны явно использовать вызов more и next; при использовании enumerator, метод moveNext обрабатывает это сам. Большинство разработчиков получали бесконечный цикл, просто потому что забывали дописать move a pointer. Это не существенная проблема, но иногда это раздражает во время разработки. При постоянном использовании enumerator, вы не столкнетесь ни с одной из этих проблем. Единственная ситуация, в которой следует использовать iterator это удаление элементов из List collection. Следующий код показывает, как это реализовать. X++: List list = new List(Types::Integer); ListIterator iterator; ; list.addEnd(100); list.addEnd(200); list.addEnd(300); iterator = new ListIterator(list); while (iterator.more()) { if (iterator.value() == 200) iterator.delete(); iterator.next(); } print list.toString(); //{100, 300} pause; |
|
|
За это сообщение автора поблагодарили: Dudnik Anton (1). |
30.10.2007, 14:55 | #11 |
Участник
|
В общем сделал сделал через MapEnumerator все работает. Спасибо за помощь.
|
|
30.10.2007, 15:25 | #12 |
SAP
|
Цитата:
В общем сделал сделал через MapEnumerator все работает. Спасибо за помощь.
|
|
30.10.2007, 16:50 | #13 |
Участник
|
В чем была причина с MapIterator'ом так и не понял и разбираться если честно некогда, а MapEnumerator поначалу сбил толку тем что смотрел значение до moveNext. Насколько я понял для большинства случаев лучше пользоваться именно MapEnumerator' ом, вот значит им и буду.
|
|
30.10.2007, 17:05 | #14 |
MCT
|
|
|