委托字典模式的默认值

时间:2014-02-18 06:38:28

标签: c# dictionary delegates

考虑以下代码:

switch (number)
{
    case 1:
        Number = (int)SmsStatusEnum.Sent;
        break;
    case 2:
        Number = (int)SmsStatusEnum.Delivered;
        break;
    case 3:
        Number = (int)SmsStatusEnum.Failed;
        break;
    default:
        Number = (int)SmsStatusEnum.Failed;
        break;
}
return Number;

我有switch case有默认值。如果number不是1,2或3,则结果为Failed。 所以我将代码转换为委托字典:

var statuses = new Dictionary<int, Func<SmsStatusEnum>>
{
    {1,()=> SmsStatusEnum.Sent},
    {2,()=> SmsStatusEnum.Delivered},
    {3,()=> SmsStatusEnum.Failed},
};

如何为委托字典模式设置默认值?

3 个答案:

答案 0 :(得分:15)

要设置默认值,您只需将Dictionary包装在函数

SmsStatusEnum GetStatus(int value) { 
  Func<SmsStatusEnum> func;
  if (!statuses.TryGetValue(value, out func)) { 
    // Default value
    return SmsStatusEnum.Failed;
  }
  return func();
}

在这种情况下,虽然我不太明白为什么要在这里存储Func<SmsStatusEnum>。实际代码是否涉及Func<SmsStatusEnum>实现中的计算?如果是这样,那确实是一个很好的模式。如果没有,那么您可能需要考虑直接存储Dictionary<int, SmsStatusEnum>

答案 1 :(得分:3)

很抱歉,但您的解决方案对我来说很糟糕。您不需要任何额外的字典来使用枚举,您可以创建一个新方法并使用Enum.TryParse方法:

SmsStatusEnum GetStatus(int value)
{     
    SmsStatusEnum val; 
    if(Enum.TryParse<SmsStatusEnum>(value.ToString(), out val))
        return val;
    else
        return SmsStatusEnum.Failed;
}

答案 2 :(得分:0)

我这样走:

var validStatues = new int[] {1, 3, 2};
if (!validStatues.Any(x=>x == statusId))
{
    statusId = 0;
}

var statuses = new Dictionary<int, Func<SmsStatusEnum>>
{
    {1,()=> SmsStatusEnum.Sent},
    {2,()=> SmsStatusEnum.Delivered},
    {3,()=> SmsStatusEnum.Failed},
    {0,()=> SmsStatusEnum.Failed},
};