LINQ & Перечисление - PullRequest
       3

LINQ & Перечисление

3 голосов
/ 13 января 2012

У меня есть это перечисление

public enum LightFiles
    { 
        PNG,
        JPG,
        GIF,
        FLV,
        TIF,
        BMP,
        MP3,
        WAV,
        WMA,
        TXT,
        PDF,
        XML,
        DOC,
        XLS,
        DBF,
        SQL,
        CSS,
        HTM
    }

И мне нужно определить, есть ли в имени файла один из перечислений.item и вернуть TRUE, если оно есть.

Я думаю, что есть какое-то решение через LINQ.Я действительно не знаю, как обойти эту проблему ...

Кто-нибудь знает, ребята?

static public bool IsLightFile(string fileName)
{ 
  // Needs some LINQ
}

Ответы [ 5 ]

11 голосов
/ 13 января 2012
static public bool IsLightFile(string fileName)
{
  //Use any with names returned from the enum.
   return Enum.GetNames(typeof(LightFiles)).Any(w => w == fileName);    
}
2 голосов
/ 13 января 2012

Немного неуверенно, что именно вы спрашиваете, я вижу три возможности ...

Если вы просто хотите, чтобы имя файла содержало любую из строк enum, вы можете сделать:

    static public bool IsLightFile(string fileName)
    {
        foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
        {
            if (fileName.Contains(eVal))
            {
                return true;
            }
        }

        return false;
    }

Или, если вы хотите посмотреть, заканчивается ли оно только этим расширением, вы можете сделать:

    static public bool IsLightFile(string fileName)
    {
        foreach (var eVal in Enum.GetNames(typeof(LightFiles)))
        {
            if (Path.GetExtension(fileName).Equals(eVal))
            {
                return true;
            }
        }

        return false;
    }

Или, если вы говорите, что filename должно быть равно enum значение полностью, вы можете сделать:

    static public bool IsLightFile(string fileName)
    {
        return Enum.IsDefined(typeof(LightFiles), fileName);
    }

Очевидно, вы захотите проверить на ноль, сделать сравнение строк без учета регистра и т. д. при необходимости.

1 голос
/ 13 января 2012

Я не понимаю, почему вы использовали бы здесь LINQ. Чтобы увидеть, является ли строка допустимым значением перечисления, чуть более естественное решение, чем зацикливание результатов Enum.GetNames, будь то явно или неявно с использованием LINQ, будет Enum.TryParse.

string fileExtension = Path.GetExtension(fileName);
if (fileExtension.StartsWith("."))
    fileExtension = fileExtension.Substring(1);
LightFiles lightFile;
return Enum.TryParse(fileExtension, true, out lightFile);

Примечание: альтернатива Enum.IsDefined всегда чувствительна к регистру, тогда как расширения файлов обычно обрабатываются как нечувствительные к регистру.

1 голос
/ 13 января 2012
static public bool IsLightFile(string fileName)
    {
      var extension = Path.GetExtension(fileName).Remove(0, 1);
      return Enum.GetNames(typeof(LightFiles)).Any(enumVal => string.Compare(enumVal, extension, true) == 0);
    }
1 голос
/ 13 января 2012
public bool IsLightFile(string filename)
{
    return Enum.GetNames(typeof(LightFiles)).Contains(
        Path.GetExtension(filename).Remove(0, 1).ToUpper());
}

Единственный способ, которым LINQ играет в этом роль, - это метод расширения Enumberable.Contains () .

См. Также:

Enum.GetNames ()
Path.GetExtension ()
String.Remove ()
String.ToUpper ()

...