2012-03-08 49 views
1

我有一个方法,需要检索一个类型的大小,例如我需要一个字符串被返回,说“小”,“中”或“大”。所以我打电话GetSize(int size)。但我也需要知道我想如何返回尺寸,我想返回“小”还是想返回“s”。所以方法增长到GetSize(int size, enum format)如何有效地设计一种方法,其中每个条件都依赖于另一个条件?

现在我可以做一个开关的情况下,但它会

switch (size)  
{  
    case SMALL_SIZE: 
     switch(format) 
      case format::short 
      case format::long 
} 

所以我会做任何情况下为“大小”里面的开关情况。我也可以将其分解并调用一种方法来获取每种大小的格式。

这看起来像很多工作,我只有3个大小的情况下,但想象这是其他事情的10个案例。我的解决方案最好还是有更好的方法?

+2

怎么样的地图<对,字符串>或类似的? – PlasmaHH 2012-03-08 14:28:42

+0

这将取决于每个'case format :: X'中实际采取的操作。如果有规则,那么你很可能会考虑因素。如果每个案例都是特定的,那将会更困难。试着提供更多关于该方法的用途(更理想的代码)。 – 2012-03-08 14:29:14

+0

两种不同的功能呢? 'GetSizeShort(int size)'和'GetSizeLong(int size)' – Tim 2012-03-08 14:38:51

回答

3

看来您的方法可以被一个简单的二维数组所取代。

// Use actual sizes in the declaration below 
static string FormattedSize[2][2] = { 
    {"small", "s"} 
, {"medium", "m" } 
// and so on... 
}; 

string GetSize(int size, enum format) { 
    return FormattedSize[size][format]; 
} 
+0

使用一对作为关键字的映射会更高效吗? – Pittfall 2012-03-08 15:14:12

+0

@Pittfall通常,以效率击败数组几乎是不可能的。但是,在这种情况下,它绝对没有关系:只有十个项目要搜索,除非在非常紧密的循环中将此函数调用数十亿次,否则不会发现任何差异。 – dasblinkenlight 2012-03-08 15:19:21

0

你也可以做线沿线的东西:

switch(true) { 
case ((size == SMALL_SIZE) && (format == format::short)): 
case ((size == MEDIUM_SIZE) && (format == format::short)): 
    return "s"; 
    break; 
case ((size == LARGE_SIZE) && (format == format::short)): 
case ((size == SMALL_SIZE) && (format == format::long)): 
    return "m"; 
    break; 
case ((size == MEDIUM_SIZE) && (format == format::long)): 
case ((size == LARGE_SIZE) && (format == format::long)): 
    return "l"; 
    break; 
} 
相关问题