如果在过滤器中没有太多,请避免使用

时间:2012-06-15 09:27:09

标签: c# design-patterns c#-4.0

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

var result = MyBlRepository.MyBLMethod(myString);

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

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

4 个答案:

答案 0 :(得分: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类型可能更合适),则不需要{{1变量只是在result情况下抛出异常(在默认情况下不再需要default)。

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

答案 1 :(得分:1)

var list = new List<string>
{
  "A", 
  "B", 
  "C",
  "D"
 };
 bool exists = list.Contains(myString);

答案 2 :(得分:1)

您需要战略模式,如here

所述

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

希望这有帮助。

答案 3 :(得分:0)

我的建议是将Regex与外部配置文件一起使用,您可以使用app.cofingcustom xml file

您存储可能的值,例如expression = "^(A|B|C|D)$" 然后在你的程序中:

var expression = ReadFromConfigFile(); 
var regex = new Regex(expression);
if(regex.IsMatch(myString))
 // do work