C# 使用字典时避免代码重复

C# 使用字典时避免代码重复,c#,asp.net,C#,Asp.net,我有以下代码片段: short adults, teens, children; dict.TryGetValue("ADT", out adults); dict.TryGetValue("TEEN", out teens); dict.TryGetValue("CHD", out children); ServiceModel.Set(adults, teens, children); 其中dict是字典类型的实例 我坚信这可以以不可重复的方式重写。 知道怎么做吗? 提前感谢您将代码替

我有以下代码片段:

short adults, teens, children;

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

ServiceModel.Set(adults, teens, children);
其中dict是字典类型的实例

我坚信这可以以不可重复的方式重写。 知道怎么做吗?
提前感谢

您将代码替换为:

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

不,没有办法缩短这个。无论你多么努力地“优化”,你都必须访问字典三次。你为什么要这么做?这些行是获取值所必需的

不过有一个建议,因为您没有正确应用
TryGetValue
。通常检查返回值是否为
true
,以指示成功。如果不成功,可以将该值设置为默认值

如果项目必须在字典中,您可以简单地使用:

adults = dict["ADT"];

如果条目不是强制性的,则代码应包括指定默认值。

您可以编写一个扩展方法,在没有键的情况下提供默认值:

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

反过来,这将降低代码中当前存在的未初始化变量的风险。

否。它不能。。。仍然在重复什么代码?
TryGetValue
返回一个布尔值以指示成功。你应该检查一下。如果你确定键存在,你可以
dict[“ADT”
]`。实际上,dict.TryGetValue似乎重复了三次,不是吗?是的,就是这样发生的。@spender我不确定dict[“ADT”]是否会被填充。正如我提到的,这本词典中的项不是强制性的,这就是我在这里使用TryGetValue的原因。不。ServiceModel.Set(…)是函数调用,dict ITAM不是必需的。@user576700关于:
ServiceModel.Set(dict.ContainsKey(“ADT”)?dict[“ADT”]:0,dict.ContainsKey(“CHD”)?dict[“TEEN”]:0,dict.ContainsKey(“CHD”)?dict[“CHD”]:0)
dict.GetValueOrDefault("nonexistentKey") //returns default(short) (0)
dict.GetValueOrDefault("nonexistentKey", 1000) //returns 1000
dict.GetValueOrDefault("existingKey", 1000) //returns value, default is ignored