Export (0) Print
Expand All

X++, C# Comparison: Collections of Keys with Values [AX 2012]

Updated: June 9, 2009

Applies To: Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2, Microsoft Dynamics AX 2012 Feature Pack, Microsoft Dynamics AX 2012

Microsoft Dynamics AX provides the Map collection class. The Map collection holds pairs of values, the key value plus a data value. This resembles the .NET Framework class named System.Collections.Generic.Dictionary.

There are similarities and differences in how a key-value collection is implemented in X++ and C#.

The following list describes similarities between X++ and C# regarding their collections that store key-value pairs:

  • Both prevent duplicate keys.

  • Both use an enumerator (or iterator) to loop through the items.

  • Both key-value collection objects are constructed with designations of the types that are stored as key and value.

  • Both can store class objects, and are not limited to storing primitives like int.

The following table describes differences between X++ and C# regarding their collections classes that store key-value pairs:

Feature

X++

C#

Comments

Duplicate keys

In X++ the Map class prevents duplicate keys by implicitly treating your call to its insert method as an operation to update only the value associated with the key.

In C# the Dictionary class throws an exception when you try to add a duplicate key.

Duplicate keys are prevented in both languages, although by different techniques.

Delete items

In X++ the delete method on an iterator object is used to remove an unwanted key-value pair from a Map.

In C# the Dictionary class has a remove method.

In both languages, an enumerator is made invalid if the collection item count is modified during the life of the enumerator.

In both languages, the type of items that the key-value collection stores must be specified. In X++ the type is specified at time of construction. In C# the type is specified at both the time of declaration and the time of construction. Code examples are in the following table.

X++

C#

Map mapKeyValue;

MapEnumerator enumer;

MapIterator mapIter;

SysCollGen.Dictionary

<int,string>

dictKeyValue;

SysCollGen.IEnumerator

<SysCollGen.KeyValuePair

<int,string>> enumer;

SysCollGen.KeyValuePair

<int,string>

kvpCurrentKeyValuePair;

In both languages, the type of items that the key-value collection stores specified during construction. For class types, X++ can get no more specific than whether the type is a class (Types::Class). Code examples are in the following table.

X++

C#

mapKeyValue =

new Map

(Types::Integer

,Types::String);

dictKeyValue = new

SysCollGen.Dictionary

<int,string>();

There is almost no difference in how an item is added to a key-value collection, in X++ and C#. Code examples are in the following table.

X++

C#

mapKeyValue.insert

(xx ,int2str(xx)

+ "_Value");

dictKeyValue.Add

(xx ,xx.ToString()

+ "_Value");

Enumerators are used to loop through the key-value collections in both X++ and C#. Code examples are in the following table.

X++

C#

enumer = mapKeyValue.getEnumerator();

while (enumer.moveNext())

{

iCurrentKey = enumer.currentKey();

sCurrentValue = enumer.currentValue();

// Display key and value here.

}

enumer = dictKeyValue

.GetEnumerator();

while (enumer.MoveNext())

{

kvpCurrentKeyValuePair = enumer.Current;

// Display .Key and .Value properties

// of kvpCurrentKeyValuePair here.

}

The syntax is very different between the two languages for an update of the value associated to a given key. Code examples for the key 102 are in the following table.

X++

C#

mapKeyValue.insert

(102 ,".insert(), Re-inserted"

+ " key 102 with a different value.");

dictKeyValue[102] =

"The semi-hidden .item property"

+ " in C#, Updated the value for key 102.";

The syntax is very different between the two languages to delete one key-value pair from a collection, while iterating through the collection members. Code examples for the key 102 are in the following table.

X++

C#

mapIter = new MapIterator

(mapKeyValue);

//mapIter.begin();

while (mapIter.more())

{

iCurrentKey = mapIter.key();

if (104 == iCurrentKey)

{

// mapKeyValue.remove would invalidate the iterator.

mapIter.delete();

break;

}

mapIter.next();

}

dictKeyValue

.Remove(104);


Announcements: To see known issues and recent fixes, use Issue search in Microsoft Dynamics Lifecycle Services (LCS).

Community Additions

ADD
Show:
© 2014 Microsoft