2

我希望在myString具有这些值 A、B、C 或 D时执行以下代码。现在我知道我有这 4 个值,但在不久的将来我可以在这个集合中有更多的值。我的代码:

var result = MyBlRepository.MyBLMethod(myString);

拥有 n 个 if else 循环的简单方法,但当我有更多值时它会增长。处理这个问题的最佳方法是什么?哪种设计模式最适合它?

编辑:我不想在这里保留过滤器。我不想修改这个文件的代码。

4

4 回答 4

2

如果您只是检查是否myString有一组常量值中的一个,您可以简单地使用switch

bool result;
switch (myString) {
    case "A":
    case "B":
    case "C":
    case "D":
        result = true;
        break;
    default:
        result = false;
        break;
}

请注意,这是此代码的一个特别长的版本:

  • 如果您想根据比较结果返回一个值,您可以只写return true;/return false;并省略这些break;行。
  • 如果您想检查该值并在它不在所需的一组值中时抛出异常(尽管enum在这种情况下类型可能更合适),您不需要该result变量,只需在这种default情况下抛出异常(并且break;在默认情况下不再需要)。

否则(如果在编译时尚未确定任何值),请按照其他答案中描述的方式使用List<string>/ HashSet<string>

于 2012-06-15T09:33:18.437 回答
1

您需要策略模式,如此处所述

它允许您很好地处理多个 if 语句。在上面的链接中有一个简短的教程展示了如何处理多个 if 语句。

希望这可以帮助。

于 2012-06-15T10:40:24.957 回答
1
var list = new List<string>
{
  "A", 
  "B", 
  "C",
  "D"
 };
 bool exists = list.Contains(myString);
于 2012-06-15T09:29:33.557 回答
0

我的 seggestion 是Regex与外部配置文件一起使用,您可以app.cofing使用custom xml file

您将这样的可能值存储expression = "^(A|B|C|D)$" 在您的程序中:

var expression = ReadFromConfigFile(); 
var regex = new Regex(expression);
if(regex.IsMatch(myString))
 // do work
于 2012-06-15T10:17:29.810 回答