【问题标题】:Is there a way to check if a string is not equal to multiple different strings?有没有办法检查一个字符串是否不等于多个不同的字符串?
【发布时间】:2011-12-04 08:32:35
【问题描述】:

我想通过文件扩展名验证文件上传器。如果文件扩展名不等于 .jpg、.jpeg、.gif、.png、.bmp 则抛出验证错误。

有没有一种方法可以在不遍历每种类型的情况下做到这一点?

【问题讨论】:

  • 循环有什么问题(可以在数组中声明)?
  • 请注意,某些应用程序/设备会创建文件扩展名 .JPEG 和 .JPG ,因此您可能需要不区分大小写。

标签: c# .net string validation string-comparison


【解决方案1】:

只需建立一个集合 - 如果它很小,几乎任何集合都可以:

// Build the collection once (you may want a static readonly variable, for
// example).
List<string> list = new List<string> { ".jpg", ".jpeg", ".gif", ".bmp", ... };

// Later
if (list.Contains(extension))
{
    ...
}

当然,这确实会遍历所有值 - 但对于小型集合,这不应该太昂贵。对于大量字符串集合,您可能希望使用HashSet&lt;string&gt; 之类的东西,这样可以提供更高效的查找。

【讨论】:

  • 对于一个小集合,我认为迭代值甚至可能比更复杂的基于哈希的集合更快。
  • 谢谢乔恩,我会在 7 分钟内接受你的回答,当我允许的时候。感谢您的快速响应。
  • 为了将来的参考:最好使用 HashSet 而不是列表。这比循环所有列表要好。
  • 该死,我很确定我错过了。对不起上帝:)
【解决方案2】:

你可以使用!Regex.IsMatch(extension, "^\.(jpg|jpeg|gif|png|bmp)$")

但在内部不知何故它仍然会循环

【讨论】:

  • 这突出了使用正则表达式的缺点 - “。”这并不意味着句号,它意味着任何字符......可能不是你的意思......
  • @fantasticfix:但我的意思是,使用正则表达式很容易犯这种错误,而且你并没有真正使用正则表达式的“模式”性质......所以为什么要在全部?只需使用集合就可以更简单地避免所有逃避的担忧等。
  • 我部分同意。但是在正则表达式恕我直言中,与案例相关的事情会更容易处理。取决于你更喜欢什么。
【解决方案3】:

将扩展名粘贴到集合中,然后检查文件的扩展名是否在该集合中。

【讨论】:

    【解决方案4】:

    这将需要一个循环,但您可以使用 LINQ 执行此操作(隐藏循环)

    即:

    using System.Linq;
    
    private readonly string[] _matches = new[] { ".jpg", ".bmp", ".png", ".gif", ".bmp" };    
    
    // Assumes extension is in the format ".jpg", "bmp", so trim the
    // whitespace from start and end
    public bool IsMatch(string extension)
    {
         return _matches.Contains(extension);
    }
    

    也可以用正则表达式来完成,但我不是正则表达式专家,所以我会把它留给另一位发帖人:)

    【讨论】:

      【解决方案5】:

      使用以下 2 个扩展。我在 CodeProject 上的一篇文章中写到了它们。干得好: http://www.codeproject.com/KB/dotnet/MBGExtensionsLibrary.aspx

              public static bool In<T>(this T t, IEnumerable<T> enumerable)
              {
                  foreach (T item in enumerable)
                  {
                      if (item.Equals(t))
                      { return true; }
                  }
                  return false;
              }
      
              public static bool In<T>(this T t, params T[] items)
              {
                  foreach (T item in items)
                  {
                      if (item.Equals(t))
                      { return true; }
                  }
                  return false;
              }
      

      当然它仍然需要一个循环,但好在你不必做那项工作。这也意味着您不必编写这样的代码:

      if (myString == "val1" ||
         myString == "val2" ||
         myString == "val3" ||
         myString == "val4" ||
         myString == "val5")
         {
            //Do something
         }
      

      【讨论】:

        【解决方案6】:

        StackOverflow 上已经有答案了。 HERE 但我建议您采取构建扩展列表的路径,然后再次检查其中的每一个。正则表达式会比这更昂贵,并且在内部会做大致相同的事情。

        【讨论】:

          【解决方案7】:

          正则表达式。

              string fx = "jpg";
              if (!Regex.IsMatch(fx, "^\.?(jpg|jpeg|gif|png|bmp)$", RegexOptions.IgnoreCase))
              {
          
              }
          

          另外,要获取文件扩展名,请使用

          string fn= file.FileName;
          if (fn.Contains("\\")) 
              fn= fn.Substring(fn.LastIndexOf("\\") + 1);
          
          string fx = fn.Substring(0, fn.LastIndexOf('.'));
          

          【讨论】:

          • 在发布答案之前编写代码怎么样? (不是我的反对意见,但这可能就是你得到它们的原因)
          • 好消息是你可以删除它并获得同伴压力徽章。但通常不接受您留下不回答问题的占位符答案。
          • 呵呵,我们不是在挑剔你,只是说留下一个占位符(正如大卫所写)一般不受欢迎。现在。你的答案是合法的,因为你写了你将来会考虑这个问题,所以我会为你投票。 :)
          • 要获取扩展,不要使用该代码,只需使用FileSystemInfo.Extension
          • 除了FileSystemInfo,还有Path.GetExtension(pathstring)。干净多了#
          【解决方案8】:

          您可以使用 switch 语句来验证文件扩展名:

          protected bool IsValidExtension(string extension)
          {
            switch (extension.ToLower())
            {
              case ".jpg":
              case ".jpeg":
              case ".gif":
              case ".png":
              case ".bmp":
                return true;
          
              default:
                return false;
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-12-21
            • 2016-03-04
            • 2020-07-16
            • 2020-03-15
            • 1970-01-01
            • 2021-01-12
            • 2022-10-13
            相关资源
            最近更新 更多