Есть ли способ проверить, если строка не равна нескольким различным строкам? - PullRequest
5 голосов
/ 10 октября 2011

Я хочу проверить загрузчик файлов по расширению файла.Если расширение файла не равно .jpg, .jpeg, .gif, .png, .bmp, тогда выдается ошибка проверки.

Есть ли способ сделать это, не просматривая каждый тип?

Ответы [ 8 ]

28 голосов
/ 10 октября 2011

Просто создайте коллекцию - если она небольшая, подойдет любая коллекция:

// 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>, что обеспечит более эффективный поиск.

5 голосов
/ 10 октября 2011

Вы можете использовать !Regex.IsMatch(extension, "^\.(jpg|jpeg|gif|png|bmp)$")

, но внутренне каким-то образом он все равно будет зацикливаться

3 голосов
/ 10 октября 2011

Для этого потребуется цикл, но вы можете сделать это с помощью LINQ (скрывает цикл)

т.е.regex wizz, так что я оставлю это другому постеру:)

3 голосов
/ 10 октября 2011

Вставьте расширения в коллекцию, затем проверьте, находится ли расширение вашего файла в этой коллекции.

2 голосов
/ 11 октября 2011

Используйте следующие 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
   }
1 голос
/ 10 октября 2011

Ответ на этот вопрос уже есть в StackOverflow. ЗДЕСЬ Но я бы посоветовал вам составить список расширений, а затем проверить каждый из них. Regex будет более дорогостоящим, и внутренне будет делать примерно то же самое.

0 голосов
/ 11 сентября 2015

Вы можете использовать оператор switch для проверки расширения файла:

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

    default:
      return false;
  }
}
0 голосов
/ 10 октября 2011

Регулярное выражение.

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