避免过滤器中的太多(如果不是其他)
本文关键字:如果不 其他 太多 免过滤 过滤器 | 更新日期: 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.cofing
或custom xml file
您可以存储可能的值,如下所示expression = "^(A|B|C|D)$"
然后在您的程序中:
var expression = ReadFromConfigFile();
var regex = new Regex(expression);
if(regex.IsMatch(myString))
// do work