C#, эквивалентный из карты C++ <строка, дважды>

Одна опция состоит в том, чтобы злоупотребить параметрами по умолчанию. т.е.:

def CalcSomething(a, _cache={}):
    if _cache.has_key(a):

Это имеет преимущество, что Вы не должны квалифицировать имя и получите быстро локальный доступ к переменным вместо того, чтобы делать два медленных dict поиска. Однако это все еще имеет проблему, что это упоминается вне функции (на самом деле, это хуже начиная с теперь в функциональной подписи.)

Для предотвращения этого лучшее решение состояло бы в том, чтобы обернуть функцию в закрытие, содержащее помехи:

@apply
def CalcSomething():
    cache = {}  # statics go here

    def CalcSomething(a):
        if cache.has_key(a):
            return cache[a]
        cache[a] = ReallyCalc(a)
        return cache[a]
    return CalcSomething
61
задан Adam Pierce 21 October 2009 в 00:19
поделиться

7 ответов

Примерно: -

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"]);
85
ответ дан 24 November 2019 в 17:13
поделиться
Dictionary<string, double> accounts;
17
ответ дан 24 November 2019 в 17:13
поделиться

Вам нужен класс Dictionary .

4
ответ дан 24 November 2019 в 17:13
поделиться

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

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

14
ответ дан 24 November 2019 в 17:13
поделиться

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

2
ответ дан 24 November 2019 в 17:13
поделиться

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

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

И содержание:

Имя: Fred; Сумма: 8,20 реалов;
Имя: Джон; Сумма: 10,00 реалов;

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

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

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

2
ответ дан 24 November 2019 в 17:13
поделиться

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

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

-Paul

1
ответ дан 24 November 2019 в 17:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: