none
Équivalent .NET de la classe multimap du C++ ? RRS feed

  • Question

  • Bonjour,

    Je connais bien le C++, mais je dois travailler sur un logiciel en C#.

    Ma question est la suivante : Existe-t-il une classe de conteneur dans la bibliothèque du .NET Framework équivalente à la classe multimap de la STL C++ ?

    Apparemment, la classe .NET SortedDictionary est équivalente à la classe STL map (recherche, insertion et suppression d’élément en O(log(N)), possibilité d’énumérer les éléments dans l’ordre de leurs clé).

    Mais dans les classes map et SortedDictionary, plusieurs éléments ne peuvent pas avoir la même clé, contrairement à la multimap, dans laquelle plusieurs éléments peuvent avoir la même clé.

    J’ai pu reproduire le comportement de multimap<type1, type2> en utilisant SortedDictionary<type1, List<type2> >, mais n’existe-t-il pas une classe qui fait directement ce que je veux ?

    Chris

    lundi 17 mai 2010 08:39

Réponses

  • Bonjour,

    Non. Chaque élément doit avoir une clé unique.
    Si vous souhaitez partager la même clé avec plusieurs éléments il vous faudra utiliser une liste d'objet comme valeur du Dictionary (comme vous l'avez défini) : SortedDictionary<TKey, List<TValue>>.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse Chris Daenia mercredi 19 mai 2010 20:36
    lundi 17 mai 2010 08:54
    Modérateur

Toutes les réponses

  • Bonjour,

    Non. Chaque élément doit avoir une clé unique.
    Si vous souhaitez partager la même clé avec plusieurs éléments il vous faudra utiliser une liste d'objet comme valeur du Dictionary (comme vous l'avez défini) : SortedDictionary<TKey, List<TValue>>.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse Chris Daenia mercredi 19 mai 2010 20:36
    lundi 17 mai 2010 08:54
    Modérateur
  • Bonjour Gilles,

    Merci pour cette réponse.

    Si d’un point de vue fonctionnel, la classe SortedDictionary<TKey, List<TValue>> peut faire la même chose que la calsse multimap<TKey, TValue> du C++, au point de vue des performances, ce n’est pas la même chose (aussi bien pour la rapidité d’exécution que pour l’utilisation de la mémoire).

    J’ai fait des tests en C++ pour comparer les performances de multimap<TKey, TValue> avec celles de map<TKey, list<TValue> >, et j’ai obtenu les résultats suivants :

     - Dans le cas où le conteneurs contient peu de clés et beaucoup d’éléments associés à chaque clé : map<…, list> est plus performant que multimap (aussi bien pour la rapidité que pour la mémoire).

     - Dans le cas où le conteneur contient beaucoup de clés différentes et peu d’éléments associés à chaque clé : multimap est plus performant que map<…, list> (aussi bien pour la rapidité que pour la mémoire).

    Par exemple, pour un conteneur contenant 1 million d’éléments, dont les clés sont presque toutes uniques : l’insertion de nouveaux éléments est 4 fois plus rapide avec multimap qu’avec map<…, list>. Et le programme avec multimap utilise 2.5 fois moins de mémoire que le programme avec map<…, list>.

    Je trouve donc dommage que le .NET Framework n’implémente pas l’équivalent de la multimap.

    Je connais des personnes qui me diraient que de toute façon, les langages .NET ne sont pas adaptés au développement d’applications ayant des exigences de performances élevées ; et que dans ce cas, il vaut mieux développer en C++ natif. Mais j’en connais d’autres qui disent au contraire que les langages .NET sont très performants si on sait les utiliser correctement… Personnellement, je ne sais pas trop qu’en penser car ni les uns ni les autres ne m’ont convaincu. Quelqu’un a-t-il un avis sur la question ?

    Chris

    mercredi 19 mai 2010 20:39