C # эквивалент карты C++



Я хочу сохранить некоторые итоги для разных учетных записей. В C++ я бы использовал 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;


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

534   8  

8 ответов:

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

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 ", accounts["Fred"]);
Dictionary<string, double> accounts;

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

Если заказ важен, вы должны использовать SortedDictionary.

вы хотите словарь класса.

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

этот код все, что вам нужно:

   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;

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

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

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

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

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

-пол

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

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

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

Comments

    Ничего не найдено.