Подтвердить что ты не робот

С# эквивалент С++ map <string, double>

Я хочу сохранить некоторые итоги для разных учетных записей. В С++ я бы использовал STL следующим образом:

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;

Теперь, как бы я сделал то же самое в С#?

4b9b3361

Ответ 1

Грубо говоря: -

var accounts = new Dictionary<string, double>();

// Initialise to zero...

accounts["Fred"] = 0;
accounts["George"] = 0;
accounts["Fred"] = 0;

// Add cash.
accounts["Fred"] += 4.56;
accounts["George"] += 1.00;
accounts["Fred"] += 1.00;

Console.WriteLine("Fred owes me ${0}", accounts["Fred"]);

Ответ 2

Dictionary<string, double> accounts;

Ответ 3

Хотя System.Collections.Generic.Dictionary соответствует тегу "hashmap" и будет хорошо работать в вашем примере, это не точный эквивалент С++ std:: map-std:: map - упорядоченная коллекция.

Если упорядочение важно, вы должны использовать SortedDictionary.

Ответ 4

Вы хотите Dictionary класс.

Ответ 5

Словарь является наиболее распространенным, но вы можете использовать другие типы коллекций, например. System.Collections.Generic.SynchronizedKeyedCollection, System.Collections.Hashtable или любая коллекция KeyValuePair

Ответ 6

Этот код вам нужен:

   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);
        }
    }

И содержимое:

Имя: Фред; Сумма: R $8,20;

Имя: Джон; Сумма: R $10,00;

Это способ сделать это на С# - декларативным способом!

Я надеюсь, что это поможет,

Рикардо Ласерда Каштелу Бранко

Ответ 7

Пока мы говорим о STL, картах и ​​словаре, я бы рекомендовал взглянуть на библиотеку C5. Он предлагает несколько типов словарей и карт, которые я часто нашел полезными (наряду со многими другими интересными и полезными структурами данных).

Если вы программист на С++, переместившись на С#, как и я, вы найдете эту библиотеку отличным ресурсом (и структурой данных для этого словаря).

-Поль

Ответ 8

Самый близкий эквивалент С++ std::map<> (внутреннее дерево) - это С# OrderedDictionary<> (внутреннее дерево), а С# OrderedDictionary<> отсутствует некоторые очень важные методы из С++ std::map<>, а именно: std::map::find, std::map::lower_bound, std::map::upper_bound, std::map::equal_range и std::map iterators, которые в основном являются основой для предыдущих 4 методов.

Почему эти 4 метода важны? Потому что он дает нам возможность находить "местонахождение" данного ключа, в дополнение к тому, что он может только проверить, существует ли ключ, или гарантированно упорядочен SortedDictionary.

Что такое "местонахождение" ключа в std::map? Ключ не обязательно должен существовать в коллекции, мы хотим знать местоположение, в котором может находиться ключ, обычно между двумя итераторами, указывающими на два соседних существующих ключа соответственно в коллекции, поэтому мы можем работать с диапазоном ключ попадает в сложность O(logN). Без таких 4 методов (с итераторами) каждый раз, когда диапазон запрашивается против ключа, нужно выполнять итерацию O(N) через коллекцию.