Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Словари C#. Значение по умолчанию для ключа.

pivel Ученик (136), на голосовании 6 месяцев назад
Появилась надобность создать словарь с ключом - string, значением - IncomeType (enum). Но в ходе работы возник интересный вопрос: как сделать так, чтобы при получении ключа, которого нет в словаре, выбиралось дефолтное значение. Я пытался это сделать с помощью ключевого слова default, но тогда прога выбрасывает исключение типа "System.ArgumentNullException: Значение не может быть неопределенным. Имя параметра: key". Исключение выбрасывается сразу, даже без запроса на ввод, как только поток доходит до создания словаря. Вот мой пример кода с default:

public enum IncomeType
{
[Description("Зарплата")]
Salary,
[Description("Инвестиция")]
Investment,
[Description("Аренда")]
Rental,
[Description("Другое")]
Other
}
Dictionary<string, IncomeType> incomeCategories = new Dictionary<string, IncomeType>
{
{"salary", IncomeType.Salary},
{"investment", IncomeType.Investment},
{"rental", IncomeType.Rental},
{"other", IncomeType.Other},
{"зарплата", IncomeType.Salary},
{"инвестиции", IncomeType.Investment},
{"аренда", IncomeType.Rental},
{"другой", IncomeType.Other},
{default, IncomeType.Other} //вот в этом моменте ошибка
};
Console.WriteLine("Введите тип дохода (Зарплата, Инвестиция, Аренда, Другой)");
IncomeType = incomeCategories[Console.ReadLine().ToLower()];

Как можно реализовать по другому эту идею?
Голосование за лучший ответ
Беспрекословный Эксперт Мыслитель (6548) 7 месяцев назад
Чтобы обеспечить возвращение дефолтного значения из словаря при обращении к несуществующему ключу, вам нужно воспользоваться методом TryGetValue вместо прямого обращения к ключу. Метод TryGetValue позволяет безопасно попытаться получить значение по ключу, и если ключ не найден, возвращает заранее определенное дефолтное значение.

Пример с использованием TryGetValue:
 using System; 
using System.Collections.Generic;
using System.ComponentModel;

public enum IncomeType
{
[Description("Зарплата")]
Salary,
[Description("Инвестиция")]
Investment,
[Description("Аренда")]
Rental,
[Description("Другое")]
Other
}

class Program
{
static void Main()
{
Dictionary incomeCategories = new Dictionary
{
{"salary", IncomeType.Salary},
{"investment", IncomeType.Investment},
{"rental", IncomeType.Rental},
{"other", IncomeType.Other},
{"зарплата", IncomeType.Salary},
{"инвестиции", IncomeType.Investment},
{"аренда", IncomeType.Rental},
{"другой", IncomeType.Other},
};

Console.WriteLine("Введите тип дохода (Зарплата, Инвестиция, Аренда, Другой)");
string input = Console.ReadLine().ToLower();

// Используем TryGetValue для безопасного получения значения
if (incomeCategories.TryGetValue(input, out IncomeType incomeType))
{
// Делаем что-то с incomeType, если ключ найден
Console.WriteLine($"Выбран тип дохода: {incomeType}");
}
else
{
// Если ключ не найден, используем дефолтное значение
incomeType = IncomeType.Other;
Console.WriteLine($"Тип дохода не распознан. Используется дефолтное значение: {incomeType}");
}
}
}
В этом примере TryGetValue проверяет, существует ли ключ в словаре. Если да, то значение, ассоциированное с ключом, присваивается переменной incomeType, и выполняется соответствующий код. Если ключ не найден, используется заранее определенное дефолтное значение, в данном случае IncomeType.Other. Таким образом, использование TryGetValue позволяет избежать исключений при обращении к несуществующим ключам и обеспечивает гибкое управление дефолтными значениями.
Максим Искусственный Интеллект (213341) 7 месяцев назад
Словарь это тебе не switch какой-нибудь. Просто сделай проверку, если ничего не нашлось, то верни своё дефолтное значение. Если тебе нужно использовать этот функционал повсеместно, тогда создай для этого метод, либо вообще наследуй Dictionary и перепеши метод.
Jurijus Zaksas Искусственный Интеллект (445813) 7 месяцев назад
А нахрена оно надо? Ключи в словаре должны быть уникальными, если у тебя нет ключа - это ошибка входных данных.
Похожие вопросы