Считать вещи с диктонарным без постоянной проверки на существование? - PullRequest
0 голосов
/ 15 апреля 2020

Сегодня я использую такой код для подсчета вещей:

Dictionary<string,int> wordCount = new Dictionary<string,int>();
if (!wordCount.ContainsKey(word))
{
    wordCount.Add(word, 0);
}
wordCount[word]++;

Есть ли более элегантный способ подсчета вещей без постоянной проверки существования?

Я хотел бы сделать что-то вроде:

Dictionary<string,int> wordCount = new Dictionary<string,int>();
wordCount[word]++;

И значения для нового ключа должны автоматически инициализироваться значением по умолчанию (например, 0 для int).

Есть ли элегантный способ получить это?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Метод TryGetValue() установит для параметра out значение по умолчанию, если ключ отсутствует. Вы можете использовать это в своих интересах, чтобы упростить код следующим образом:

wordCount.TryGetValue(word, out int count);
wordCount[word] = count + 1;

Это примерно так же просто, как вы собираетесь получить, когда вы не знаете, какие ключи вы собираетесь использовать за исключением итерации по данным (очевидно, если вы знали ключи, вы могли бы инициализировать словарь со всеми ключами, прежде чем начинать считать).

Конечно, вы всегда можете инкапсулировать любой часто используемый код в методе расширения или другой абстракции, для дальнейшего упрощения самого сайта вызова. Выше объясняется, как упростить реализацию .

1 голос
/ 16 апреля 2020

Вы можете определить метод расширения для словарей следующим образом:

public static class DictionaryExtension
{
    public static void AddCount<T>(this Dictionary<T, int> dict, T key)
    {
        if (dict.ContainsKey(key))
        {
            dict[key]++;
        }
        else
        {
            dict[key] = 1;
        }
    }
}

Затем вы можете использовать его следующим образом:

Dictionary<string, int> count = new Dictionary<string, int>();
count.AddCount("foo");
count.AddCount("bar");
count.AddCount("foo");

К go далее вы можете получить Новый тип от Dictionary и ввести новый индексатор:

public class FancyDict<T> : Dictionary<T,int>
{
    public new int this[T key]
    {
        get => this.ContainsKey(key) ? base[key] : 0;
        set => base[key] = value;
    }
}

Это позволяет использовать синтаксис []:

FancyDict<string> fancyCount = new FancyDict<string>();
fancyCount["foo"]++;
fancyCount["bar"]++;
fancyCount["foo"]++;

foreach (var key in fancyCount.Keys)
{
    Console.WriteLine(key + " : " + fancyCount[key]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...