2015-08-13 4 views
-3

У меня следующий фрагмент кода:Избегайте повторения кода при использовании словаря

short adults, teens, children; 

dict.TryGetValue("ADT", out adults); 
dict.TryGetValue("TEEN", out teens); 
dict.TryGetValue("CHD", out children); 

ServiceModel.Set(adults, teens, children); 

где ДИКТ является густонаселенным экземпляром типа словаря.

Я твердо верю, что это можно было бы переписать не повторяющимся образом. Любая идея как? Спасибо заранее

+1

№ Это не может ... Какой код все равно повторяется? –

+0

'TryGetValue' возвращает логическое значение для указания успеха. Вы должны проверить это. Если вы уверены, что существуют ключи, вы можете 'dict [" ADT "'] '. – spender

+0

На самом деле кажется, что dict.TryGetValue повторяется три раза, не так ли? – user576700

ответ

1

Вы заменить ваш код:

ServiceModel.Set(dict["ADT"], dict["TEEN"], dict["CHD"]); 
+0

Нет. ServiceModel.Set (...) - вызов функции, а dict itams не являются обязательными. – user576700

+1

@ user576700 Как насчет: 'ServiceModel.Set (dict.ContainsKey (" ADT ")? Dict [" ADT "]: 0, dict.ContainsKey (" CHD ")? Dict [" TEEN "]: 0, dict.ContainsKey ("CHD")? Dict ["CHD"]: 0) '? –

0

No. Там нет способа, чтобы получить это короче. Вы должны получить доступ к словарю три раза, независимо от того, как сильно вы пытаетесь «оптимизировать». И почему бы тебе? Эти строки необходимы для получения значений.

Одно предложение, так как вы не применяете TryGetValue правильно. Обычно вы проверяете, является ли возвращаемое значение true, чтобы указать успех. Если это не удалось, вы можете установить значение по умолчанию.

Если элементы должны быть в словаре, вы можете просто использовать:

adults = dict["ADT"]; 

Если записи не являются обязательными, ваш код должен включать в себя назначение значения по умолчанию.

+0

Как я уже говорил, элементы в этом словаре не являются обязательными, вот почему я использую TryGetValue здесь. – user576700

+0

Хорошо, затем примените его правильно. –

0

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

public static class DictEx 
{ 
    public static TVal GetValueOrDefault<TKey, TVal>(
     this IDictionary<TKey, TVal> dict, TKey key, TVal defaultValue = default(TVal)) 
    { 
     TVal val; 
     return dict.TryGetValue(key, out val) ? val : defaultValue; 
    } 
} 

и использовать его вместе с Dictionary<string,short>

dict.GetValueOrDefault("nonexistentKey") //returns default(short) (0) 
dict.GetValueOrDefault("nonexistentKey", 1000) //returns 1000 
dict.GetValueOrDefault("existingKey", 1000) //returns value, default is ignored 

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

Смежные вопросы