C# équivalent de C++ map<string,double>
Je veux garder certains totaux pour les différents comptes. En C++, j'aimerais utiliser la STL comme ceci:
map<string,double> accounts;
//Add some amounts to some accounts.
accounts["Fred"] += 4.56;
accounts["George"] += 1.00;
accounts["Fred"] += 1.00;
cout << "Fred owes me $" << accounts['Fred'] << endl;
Maintenant, comment pourrais-je faire la même chose en C# ?
Vous devez vous connecter pour publier un commentaire.
En gros:-
var
?accounts["Fred"] = 0;
dans cet exemple est équivalent àaccounts.Add("Fred", 0);
(Voir dotnetfiddle.net/q3UteL pour les deux variantes) Également: *Lorsque vous utilisezDictionary.Add( Key, Value )
pour ajouter un nouveauKeyValuePair
unArgumentException
est levée si l'Key
existe déjà dans le dictionnaire. *L'utilisation de l'indexeur (Dictionary[ Key ]
) vous obtenez un implicite ajouter ou mettre à jour comportement depuis leKey
sera automatiquement ajouté si il ne figure pas déjà dans le Dictionnaire, autrement, la valeur correspondante sera simplement mis à jour. *Envisager l'utilisation de décimales pour la monnaieMême Système.Les Collections.Génériques.Dictionnaire correspond à la balise "table de hachage" et va bien travailler dans votre exemple, il n'est pas un équivalent exact de C++std::map - std::map est une collection ordonnée.
Si la commande est importante, vous devez utiliser SortedDictionary.
Vous voulez le Dictionnaire classe.
Dictionnaire est le plus commun, mais vous pouvez utiliser d'autres types de collections, par exemple
Système.Les Collections.Génériques.SynchronizedKeyedCollection, Système.Les Collections.Table de hachage, ou tout KeyValuePair collection
Ce code est tout ce dont vous avez besoin:
Et le contenu est:
Nom: Fred; Quantité: R$ 8,20;
Nom: Jean; Quantité: R$ 10,00;
C'est la façon de le faire en C# - de manière déclarative!
J'espère que cette aide,
Ricardo Lacerda Castelo Branco
Alors que nous parlons de la STL, de cartes et de dictionnaire, je vous recommande de prendre un coup d'oeil à la C5 de la bibliothèque. Il propose plusieurs types de dictionnaires et de cartes que j'ai souvent trouvé utile (avec beaucoup d'autres d'intéressant et d'utile structures de données).
Si vous êtes un programmeur C++ de passer au C# comme je l'ai fait, vous trouverez cette bibliothèque une grande ressource (et une structure de données pour ce dictionnaire).
-Paul
L'équivalent le plus proche de C++
std::map<>
(un arbre à l'interne) est C#OrderedDictionary<>
(un arbre à l'interne), tandis que le C#OrderedDictionary<>
manque très important de méthodes de C++std::map<>
, à savoir:std::map::find
,std::map::lower_bound
,std::map::upper_bound
,std::map::equal_range
, etstd::map
iterators
, qui sont essentiellement la colonne vertébrale pour les 4 précédents méthodes.Pourquoi ces 4 méthodes sont-elles importantes? Parce qu'il nous donne la possibilité de localiser la "localisation" d'une clé donnée, en plus de ne pouvoir vérifier si une clé existe, ou le SortedDictionary est garanti d'être commandés.
Quelle est la "localisation" d'une clé dans un
std::map
? Les clés ne sont pas nécessairement présents dans la collection, nous voulons connaître l'emplacement de la clé pourrait être à la, habituellement entre deux itérateurs de pointage à deux adjacents clés existantes, respectivement, dans la collection, de sorte que nous pouvons opérer sur le gamme la clé tombe dans unO(logN)
complexité. Sans ces 4 méthodes (avec les itérateurs), on a à faire à unO(N)
itération à travers la collecte à chaque fois qu'une gamme est interrogée sur une touche.