代码之家  ›  专栏  ›  技术社区  ›  Bokambo

更动态地处理if/else

c#
  •  1
  • Bokambo  · 技术社区  · 6 年前

    我需要的建议,如何处理这个更动态到现在如果你看到下面的代码,我硬编码findText[0]和findText[1],但后来findText值可以增长,我不知道有多少值,在这种情况下有多少索引,我将不知道。

    我知道使用foreach循环可以处理这种情况,但问题是假设我有两个值“abc,xyz”abc是第一个值,所以假设如果在行中找不到abc,它将转到else部分并将行追加到stringbuilder,现在当下一个值出现“xyz”并且在行中找到它时,它将再次追加。那怎么处理呢?为了处理这个问题,我使用了findtext[0]和findtext[1]方法,但这并不适用于所有场景。

       foreach (string fText in findText.Split(','))
        {
        if (line.IndexOf(fText , StringComparison.OrdinalIgnoreCase) >= 0) //line.Contains(findText)
             {
                  Regex regexText = new Regex(findText[0], RegexOptions.IgnoreCase);
                  line = regexText.Replace(line, "<span style =\"background-color: #FFFF00\">" + findText[0] + " </span>");
                  builder.Append(line);
             }
    else
             {
                  builder.Append(line);
                  builder.Append("<br/>");
             }
        }
    

    目前使用的方法-

    string[] findText = ("suspicious,suspcious").Split(',') ;
    while ((line = sr.ReadLine()) != null)
    {
    
       if (line.IndexOf(findText[0], StringComparison.OrdinalIgnoreCase) >= 0) //line.Contains(findText)
         {
              Regex regexText = new Regex(findText[0], RegexOptions.IgnoreCase);
              line = regexText.Replace(line, "<span style =\"background-color: #FFFF00\">" + findText[0] + " </span>");
              builder.Append(line);
         }
       if (line.IndexOf(findText[1], StringComparison.OrdinalIgnoreCase) >= 0) //line.Contains(findText)
         {
              Regex regexText = new Regex(findText[1], RegexOptions.IgnoreCase);
              line = regexText.Replace(line, "<span style =\"background-color: #FFFF00\">" + findText[1] + " </span>");
              builder.Append(line);
         }
       else
         {
              builder.Append(line);
              builder.Append("<br/>");
         }
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Sergey Kalinichenko    6 年前

    由于条件块的内容看起来是相同的,因此可以使用LINQ查找第一个匹配项,如下所示:

    var find = findText.FirstOrDefault(t => line.IndexOf(t, StringComparison.OrdinalIgnoreCase) >= 0);
    if (find != null) {
        Regex regexText = new Regex(find, RegexOptions.IgnoreCase);
        line = regexText.Replace(line, "<span style =\"background-color: #FFFF00\">" + find + " </span>");
        builder.Append(line);
    } else {
        builder.Append(line);
        builder.Append("<br/>");
    }
    

    FirstOrDefault 将产生初始匹配或 null

        2
  •  0
  •   Broom    6 年前
    while ((line = sr.ReadLine()) != null)
                {
    
                    string[] finds = findText.Split(',');
    
                    bool found = false;
                    foreach (string find in finds)
                    {
                        if (Regex.IsMatch(line, find, RegexOptions.IgnoreCase))
                        {
                            found = true;
                            Regex regexText = new Regex(find, RegexOptions.IgnoreCase);
                            line = regexText.Replace(line, "<span style =\"background-color: #FFFF00\">" + find + " </span>");
                            builder.Append(line);
                            break;
                        }
                    }
                    if (!found)
                    {
                        builder.Append(line);
                        builder.Append("<br/>");
                    }
                }