我有一种情况,我必须在if语句中排除一个不断增长的条件列表,这些条件开始时非常简单
我想过循环一个列表/数组,我尽可能使用RegEx。
我想知道其他人为尝试和简化这些情况所做的工作。
这是一个简单的例子:
if (!DataField.Contains(strText) & (strOtherText.IndexOf(strFindThis) < 0) || Regex.isMatch(strWithLetters, @"[A-Z]"))
{
//Do things;
}
else
{
//Do Other Things;
}
仍在学习RegEx,但我正在研究它
到目前为止,它只是几个字或几个字符串。
例如:
到目前为止,我有23个
答案 0 :(得分:1)
这实际上取决于你的条件表达式,但你可以使用类似的东西:
List<Func<bool>> expressions = new List<Func<bool>>();
expressions.Add(()=>anyConditionalExpression());
if(expressions.All(x=>x.Invoke())){
//do something;
}
else{
//do something else;
}
答案 1 :(得分:1)
我会创建一个接口,一个实现您需要支持的各种验证标准。完成后,可以将实现对象放入一个集合中,该集合可以传递给验证方法。
public interface IValidator
{
bool IsValid(String currentLine);
}
将实施具体的课程以支持您的规则:ContainsStringValidator
和RegexMatcherValidator
会从您上面的示例中想到。
List<IValidator> rules = new ArrayList<IValidator>();
rules.Add(new ContainsStringValidator("StringToLookFor"));
rules.Add(new RegexMatcherValidator(@"[A-Z]"));
现在规则已经收集到一个可管理的单元中,您可以编写代码来解析文件。
public void CheckLine(String line, List<IValidator> rules)
{
foreach (IValidator v in rules)
{
if (v.IsValid(line))
{
// it works
}
else
{
// do something when bad
}
}
}
答案 2 :(得分:0)
是的,在没有看到你的条件的情况下很难给出具体的答案,但总的来说:
将每个条件放在一个新行上。
如果您的条件组具有相同但输入不同的条件,则可以将它们抽象为一次检查多个条件的函数。
例如,
if(str1 != null && str1.Length > 5 && str2 != null && str2.Length > 5)
{...}
到
bool isNice(str)
{
return str != null && str.Length > 5;
}
if(isNice(str1) &&
isNice(str2))
{...}