【问题标题】:C# IF statement not breaking correctlyC# IF 语句未正确中断
【发布时间】:2012-09-15 04:18:49
【问题描述】:

一直把我的头撞到墙上,谷歌试图找到我的问题的答案。

当下面的 IF 语句执行时,似乎完全通过 IF 和 ELSE 语句运行。

  if (IsPostBack)
         {
             Boolean bFileOK = false;

             if (fulReagentImg.HasFile)
             {
                 String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
                 String sFileExtensionLabel = sFileExtension;
                 lblFileExtension.Text = sFileExtensionLabel;
                 String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
                 for (int i = 0; i < allowedExtensions.Length; i++)
                 {
                     if (sFileExtension == allowedExtensions[i])
                     {
                         bFileOK = true;
                     }
                     else
                     {
                         lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                         lblException.CssClass = "red";
                     }

 }

任何想法为什么它没有停止 bFileOK = true?

【问题讨论】:

  • 听说过“String.CompareTo()”吗?还是“String.Contains()”?我会劝阻使用 "==";我肯定会添加一个“休息”。 stackoverflow.com/questions/9089716/…
  • 我可能会使用List(不是数组)和if (allowedExtensions.Contains(sFileExtension)) { /* good */ } else { /* bad */ }。确保先规范化大小写。
  • 看到人们认为代码应该如何工作以及它实际上是如何工作的,我真的很着迷。让我对人们发展的不同心理模型感到好奇。

标签: c#


【解决方案1】:

您的循环完全错误。
如果用户的扩展名不等于列表中的所有个扩展名,则会显示错误。

您应该调用Contains() 方法,最好是HashSet&lt;String&gt;

【讨论】:

  • 为什么觉得HashSet&lt;string&gt;合适?
  • 我也会使用包含方法。但是,对于这么小的 n .. 它在这里充其量是分裂的头发。
  • @ChaosPandion:因为它是 O(1)。
  • @SLaks - 我知道使用这种结构的理论原因,所以我真正应该问的是为什么将它用于这么小的 n?作为一个行业,我们是否应该总是打破一个哈希表进行查找?我们什么时候可以退回到线性搜索?
  • @ChaosPandion 1) 拥有一个好习惯 2) 如果没有测试,您无法判断 HashSet 在哪个 n 处真正开始优于 Array。我只见过 HashSet >= Array 的性能,在查找时从未见过 HashSet personal experience 我需要在将无效字符从 StreamReader 中过滤掉之前,然后将它们传递给 XmlReader。我有 4 个字符要测试,但是从 Array 更改为 HashSet 将我的运行时间从 35 秒更改为 4 秒。
【解决方案2】:

因为您的 sFileExtension 是单个扩展名,而不是所有四个允许的扩展名。这意味着即使 sFileExtension 是允许的扩展之一,它仍然不会是其他三个,所以无论如何,你的 else 语句都会被命中。

【讨论】:

    【解决方案3】:

    我认为您希望当 bFileOK =true 时您应该中断;然后使用break语句

    if (IsPostBack)
        {
            Boolean bFileOK = false;
    
            if (fulReagentImg.HasFile)
            {
                String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
                String sFileExtensionLabel = sFileExtension;
                lblFileExtension.Text = sFileExtensionLabel;
                String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
                for (int i = 0; i < allowedExtensions.Length; i++)
                {
                    if (sFileExtension == allowedExtensions[i])
                    {
                        bFileOK = true;
                        break;
                    }
                    else
                    {
                        lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                        lblException.CssClass = "red";
                    }
    
    }
    

    【讨论】:

      【解决方案4】:

      您不应该在 for 循环中包含 else ,否则您将发布失败消息至少 allowedExtensions.Length-1 次。

      将 else 移出 for 循环,并让它跟随:

      if(bFileOK)
      {
      //Do Stuff
      }
      

      【讨论】:

        【解决方案5】:

        是否有可能允许扩展中的第一项成功而第二项失败从而进入标准的第一部分和第二部分?也许你的意思是:

        if (IsPostBack)
            {
                Boolean bFileOK = false;
        
                if (fulReagentImg.HasFile)
                {
                    String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
                    String sFileExtensionLabel = sFileExtension;
                    lblFileExtension.Text = sFileExtensionLabel;
                    String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
                    for (int i = 0; i < allowedExtensions.Length; i++)
                    {
                        if (sFileExtension == allowedExtensions[i])
                        {
                            bFileOK = true;
                        }
                    }
                    if (!bFileOK)
                    {
        
                            lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                            lblException.CssClass = "red";
        
                    }
             }
        }
        

        【讨论】:

          【解决方案6】:

          您需要在设置 bFileOk 为 true 后添加一个 break 语句。当您循环遍历数组中的每个字符串时,您实际上只测试了最后一个字符串 I 是数组。

          我还将研究 Array.Contains 它将提供更清晰的实现。

          【讨论】:

            猜你喜欢
            • 2021-11-29
            • 2012-07-01
            • 1970-01-01
            • 2021-09-07
            • 1970-01-01
            • 2019-08-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多