有没有办法检查一个字符串是否不等于多个不同的字符串?

5

我希望通过文件扩展名验证文件上传器是否有效。如果文件扩展名不等于 .jpg、.jpeg、.gif、.png、.bmp,则抛出验证错误。

是否有一种方法可以在不循环遍历每种类型的情况下完成此操作?


1
循环有什么问题吗?(你可以在数组中声明它们)? - Amittai Shapira
请注意,某些应用程序/设备会创建文件扩展名为 .JPEG 和 .JPG,因此您可能需要进行不区分大小写的匹配。 - Piskvor left the building
8个回答

28

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

// 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<string> 的东西,它提供了更有效的查找。


2
对于一个小集合,我想迭代值甚至可能比更复杂的基于哈希的集合更快。 - David Heffernan
谢谢Jon,我会在7分钟后接受你的答案,因为SO让我这么做。感谢您的快速回复。 - Chaddeus
为了以后的参考:最好使用HashSet<string>而不是列表。这比循环整个列表更好。 - Ori Refael
该死,我很确定我错过了它。对不起,上帝 :) - Ori Refael

5
你可以使用 !Regex.IsMatch(extension, "^\.(jpg|jpeg|gif|png|bmp)$") ,但内部仍然会循环。

1
这突显了使用正则表达式的缺点 - "." 不代表句号,而是任意字符...可能不是你想要的... - Jon Skeet
@fantasticfix:但我的观点是,使用正则表达式很容易犯这种错误,而且你并没有真正利用正则表达式的“模式”特性...那么为什么要使用它们呢?通过使用集合,避免所有转义问题等,会更简单。 - Jon Skeet
1
我部分同意。但在我的看法中,使用正则表达式处理与案例相关的事项会更加容易解决。这取决于你更熟悉哪种方法。 - fixagon

3

这将需要一个循环,但是您可以使用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);
}

这也可以使用正则表达式来完成,但我不是一个熟练的正则表达式用户,所以我会把这个任务留给另一个发帖者 :)

3
使用以下两个扩展。我在 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
   }

3
将扩展名添加到集合中,然后检查你的文件的扩展名是否在该集合中。

1

在StackOverflow上已经有了答案。这里 但我建议您采取构建扩展列表的方法,然后对每个扩展进行检查。正则表达式比这更耗费资源,而且内部执行的大致相同。


0

正则表达式。

    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('.'));

1
写回答前先编写代码怎么样?(不是我给你的踩,但这可能是原因) - Avada Kedavra
2
好消息是,您可以删除此内容并获得同侪压力徽章。但通常不建议您留下一个没有回答问题的占位符答案。 - David Heffernan
1
呵呵,我们并不是针对你,只是想说留下一个占位符(就像David所写的)通常不被欣赏。现在,你的回答是合法的,而且既然你写道你将来会考虑这个问题,我会为你点赞的。 :) - Avada Kedavra
1
要获取扩展名,不要使用那段代码,直接使用 FileSystemInfo.Extension - CodeCaster
1
与其使用FileSystemInfo,不妨使用Path.GetExtension(pathstring)。这样做更加简洁。 - Firo
显示剩余5条评论

0

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

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

    default:
      return false;
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接