86 Stimmen

C#-Entsprechung von C++ map<string,double>

Ich möchte einige Summen für verschiedene Konten behalten. In C++ würde ich STL wie folgt verwenden:

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;

Wie würde ich dasselbe in C# tun?

1 Stimmen

C#-Wörterbuch ist gleichbedeutend mit C++ unordered_map . Außerdem, C# SortedDictionary ist gleichbedeutend mit C++ Karte .

2voto

Dieser Code ist alles, was Sie brauchen:

   static void Main(string[] args) {
        String xml = @"
            <transactions>
                <transaction name=""Fred"" amount=""5,20"" />
                <transaction name=""John"" amount=""10,00"" />
                <transaction name=""Fred"" amount=""3,00"" />
            </transactions>";

        XDocument xmlDocument = XDocument.Parse(xml);

        var query = from x in xmlDocument.Descendants("transaction")
                    group x by x.Attribute("name").Value into g
                    select new { Name = g.Key, Amount = g.Sum(t => Decimal.Parse(t.Attribute("amount").Value)) };

        foreach (var item in query) {
            Console.WriteLine("Name: {0}; Amount: {1:C};", item.Name, item.Amount);
        }
    }

Und das ist der Inhalt:

Name: Fred; Betrag: R$ 8,20;
Name: John; Betrag: R$ 10,00;

Das ist die Art und Weise, wie man das in C# macht - auf deklarative Weise!

Ich hoffe, das hilft,

Ricardo Lacerda Castelo Branco

0 Stimmen

Nun, ich habe es bereits mit Dictionary gemacht, aber das XML ist wirklich einfach, nur eine Liste von Tags wie diese: <transaction name="Fred" amount="5.20" />

1voto

Paul Punkte 5328

Da wir gerade über STL, Karten und Wörterbücher sprechen, empfehle ich einen Blick auf die C5 Bibliothek. Sie bietet mehrere Arten von Wörterbüchern und Karten, die ich häufig als nützlich empfunden habe (zusammen mit vielen anderen interessanten und nützlichen Datenstrukturen).

Wenn Sie ein C++-Programmierer sind, der wie ich zu C# wechselt, werden Sie in dieser Bibliothek eine großartige Ressource (und eine Datenstruktur für dieses Wörterbuch) finden.

-Paul

1voto

Dejavu Punkte 1149

Das nächstliegende Äquivalent von C++ std::map<> (ein interner Baum) ist C# OrderedDictionary<> (ein interner Baum), während C# OrderedDictionary<> fehlen einige sehr wichtige Methoden aus C++ std::map<> , nämlich: std::map::find , std::map::lower_bound , std::map::upper_bound , std::map::equal_range und std::map iterators die im Grunde das Rückgrat der 4 vorangegangenen Methoden bilden.

Warum sind diese 4 Methoden wichtig? Weil sie uns die Möglichkeit geben, den "Aufenthaltsort" eines bestimmten Schlüssels ausfindig zu machen, zusätzlich zu der Möglichkeit, nur zu prüfen, ob ein Schlüssel existiert oder ob das SortedDictionary garantiert geordnet ist.

Was ist der "Verbleib" eines Schlüssels in einem std::map ? Der Schlüssel muss nicht notwendigerweise in der Sammlung vorhanden sein. Wir wollen wissen, an welcher Stelle sich der Schlüssel befinden könnte, in der Regel zwischen zwei Iteratoren, die jeweils auf zwei benachbarte vorhandene Schlüssel in der Sammlung zeigen, so dass wir mit dem Bereich fällt der Schlüssel in eine O(logN) Komplexität. Ohne solche 4 Methoden (mit Iteratoren) muss man eine O(N) Iteration durch die Sammlung jedes Mal, wenn ein Bereich gegen einen Schlüssel abgefragt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X