如果条件那么如何简化复杂的工作?

时间:2016-05-05 18:07:38

标签: c# .net regex multiple-conditions

我有一种情况,我必须在if语句中排除一个不断增长的条件列表,这些条件开始时非常简单

我想过循环一个列表/数组,我尽可能使用RegEx。

我想知道其他人为尝试和简化这些情况所做的工作。

这是一个简单的例子:

if (!DataField.Contains(strText) & (strOtherText.IndexOf(strFindThis) < 0) || Regex.isMatch(strWithLetters, @"[A-Z]"))
{
    //Do things;
}
else
{
    //Do Other Things;
}

仍在学习RegEx,但我正在研究它

到目前为止,它只是几个字或几个字符串。

例如:

  • “#,&amp;,^,@等等......”
  • “表格9999-99无效的客户名称”
  • 无法以“https”或“http”
  • 开头
  • 在某些情况下,如果它包含类似“错误代码”的字符串,那么它将保存在备用文件中,而不是简单地被忽略以进行处理

到目前为止,我有23个

3 个答案:

答案 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);
}

将实施具体的课程以支持您的规则:ContainsStringValidatorRegexMatcherValidator会从您上面的示例中想到。

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))
{...}