避免过滤器中的太多(如果不是其他)

本文关键字:如果不 其他 太多 免过滤 过滤器 | 更新日期: 2023-09-27 18:37:22

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

var result = MyBlRepository.MyBLMethod(myString);

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

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

避免过滤器中的太多(如果不是其他)

如果您只是检查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>

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

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

希望这有帮助。

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

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

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

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