2012-01-13 2 views
3

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

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

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

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

Любые знакомые?

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

Вы хотите, чтобы это было где угодно в имени файла? Или просто расширение? –

+1

@JamesMichaelHare расширение только. Благодарим вас за подробный ввод @JamesMichaelHare! (+1) –

ответ

11
static public bool IsLightFile(string fileName) 
{ 
    //Use any with names returned from the enum. 
    return Enum.GetNames(typeof(LightFiles)).Any(w => w == fileName);  
} 
+1

Это круто! Спасибо!! –

+0

На самом деле вы можете использовать 'Enum.IsDefined()' для проверки и избежания 'Any()' вообще. –

+0

@JamesMichaelHare, это правда, но с Any мы можем управлять, например. вы проверяете смешанный случай Enum.IsDefind() не сработает при передаче «dOC», но с помощью .Any вы можете использовать. Любой (w => w.ToLower() == fileName.ToLower()) –

2

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

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

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); 
    } 

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

+0

Спасибо! Да, я знаю. Но я думаю, это должно быть какое-то решение LINQ. –

+0

Почему это должно быть решение LINQ? Сказали ли вы сделать это с помощью LINQ? –

+0

@DmitryBoyko: Contains() - метод расширения LINQ. Или вы имеете в виду, что вы должны сделать это как выражение LINQ? Если да, то почему? –

1
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

Я не понимаю, почему вы хотите использовать 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 всегда чувствителен к регистру, в то время как расширения файлов, как правило, рассматриваются как нечувствительны к регистру.

Смежные вопросы