-1

我有三个if声明,它们显然正在处理不同的功能。我想将它们组合成一个函数,因此我必须组合if语句。但我被困在如何使用|| &&and ()

我的功能是过滤器,用户可以填写任何文本框。在按钮单击事件上,代码将找到符合条件的那些。其中三个独立工作良好,但将它们组合起来非常困难。请多多包涵并帮助我,我只是一个非常新的程序员,完全没有背景。我被困了好几天。;(

我的过滤器快照:

过滤器

第一的:

if (itemAuthor.ToLower() == txtComAuthor.Text.ToString().ToLower())

第二:

if ((!DateTime.TryParseExact(txtComStartDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out startDate)
      || DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) >= startDate) &&
      (!DateTime.TryParseExact(txtComEndDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out endDate)
      || DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) <= endDate))

第三:

if (txtComKeyword1.Text != (String.Empty) && itemDescription.ToLower().Contains(txtComKeyword1.Text.ToLower()) ||
    txtComKeyword2.Text != (String.Empty) && itemDescription.ToLower().Contains(txtComKeyword2.Text.ToLower()) ||
    txtComKeyword3.Text != (String.Empty) && itemDescription.ToLower().Contains(txtComKeyword3.Text.ToLower()) ||
    txtComKeyword4.Text != (String.Empty) && itemDescription.ToLower().Contains(txtComKeyword4.Text.ToLower()))
4

4 回答 4

4

是否使用|| 或 && 取决于您是否想要至少一个条件为真(使用 ||)或所有条件都必须为真(使用 &&)的含义。

如果您需要混合两种含义,请使用 () 使条件相互评估,例如

if ( (a && b) || (c && d))

表示如果a 和 b 都为真 ,或者 c 和 d 都为真

如果您为复合逻辑的每个部分定义单独的布尔值,它会使代码更易于阅读和维护。没有性能差异。

bool condition1 = !DateTime.TryParseExact(txtComStartDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out startDate);
bool condition2 = DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) >= startDate);
bool condition3 = !DateTime.TryParseExact(txtComEndDate.Text, "dd/MM/yy", provider, DateTimeStyles.AssumeLocal, out endDate);
bool condition4 = DateTime.Parse(itemDate, provider, DateTimeStyles.AssumeLocal) <= endDate);

if ((condition1
      || condition2 &&
      (condition3
      || condition4)
于 2012-08-20T16:36:18.913 回答
2

如果将这些子句中的每一个分解为函数并相应地划分复杂性,它将帮助您理解。从长远来看,较小的部分更易于使用,并且更易于维护。当您发展为程序员时,您最终将根本不会为此使用 if 语句,而是利用多态性的力量。

现在,先把事情分开。

public void btnAnalyze_onClick(){
    List<Item> results = new ArrayList<Item>();
    if(txtComAuthor.Text != String.Empty)
    { 
       List<Item> matched = filterByAuthor(txtComAuthor.Text);
       results.addRange(matched);
    }
    if(txtComStartDate.Text != String.Empty)
    {
       List<Item> matched = filterByStartDate(txtComStartDate.Text);
       results.addRange(matched);
    }
    // do the same for the others
    return results;
}



public List<Item> filterByAuthor(String desiredAuthorName){
      List<Item> matches = new ArrayList<Item>();
      //have your data access piece here, from DB/Excel/whatever.
      List<Item> candidates = ...
      foreach(Item candidate in candidates){
         if(candidate.ToLower() == desiredAuthorName){ 
            matches.add(candidate)
         }
       }
       return matches;
}

有经验的程序员会意识到这里有很多重复,并且会适应违反 DRY 和性能的问题。没关系。它可以重构。对于新手来说,这将是最容易理解的风格。

如果您遵循这种风格,那么您需要在哪里进行过滤应该很明显。基本上,您需要将 foreach 循环中的 if 语句替换为您正在考虑的文本字段的条件。

但是你不应该需要将一堆子句添加在一起这样做,因为你已经更好地分解了一些东西。如果您仍然发现需要一些嵌套的 if,请将其进一步分解为更小的函数。

于 2012-08-20T16:48:56.807 回答
1

如果对逻辑分组有疑问,请在每对操作周围加上括号。这样你就知道如何组合这些对了。

if ((A && B) || (C && D))将评估(A && B)(C && D)段,然后将这些中间结果“或”在一起以产生最终值。

如需进一步阅读,请搜索布尔逻辑的交换、关联和分配属性。

于 2012-08-20T16:37:39.937 回答
0

据我所知,您想同时评估所有 3 个,但简单地将它们添加到一个大行中将难以阅读或维护。我建议为您之前的每个 if 设置单独的 bool 值:

bool firstIf = (itemAuthor.ToLower() == txtComAuthor.Text.ToString().ToLower());

然后在一个语句中比较所有 3 个:

if (firstIf && secondIf && thirdif)
{
    Console.WriteLine("It works!");
}

这样,如果需要,以后更容易进行更改,并且您仍然可以阅读代码。

于 2012-08-20T16:36:26.573 回答