2008-11-29 12 views
13

Mam enumSprawdź, czy enum ma pole, które jest równy ciąg

public enum FileExtentions { 
    mp3, 
    mpeg 
} 

I mam FileInfo z którego chcę, aby sprawdzić, czy rozszerzenie jest w poprzednim wyliczenia. Miałem nadzieję, że zrobię

FileExtensions.Any(e=>e.ToString().Equals(file.Extension)); 

Ale to byłoby zbyt niesamowite. Jakieś pomysły?

Odpowiedz

21

Co jest powodem Any ... Equals? Czy przeoczyłeś Contains?

bool result = Enum.GetNames(typeof(FileExtensions)).Contains("mp3"); 
+0

Masz rację: P –

+0

To wymaga 'using System.Linq', poprawne? –

8

Naciskając złożyć myślałem o odpowiedź sobie:

Enum.GetNames(typeof(FileExtensions)).Any(f=>f.Equals("."+file.Extension)) 
+0

Ale nie możesz oznaczyć własnego wpisu jako odpowiedzi. Ale myślę, że to logiczne. –

+0

file.Extension ma okres wiodący - nie nazwy wyliczeniowe. Nie powinno to być (f => ("." + F) .Equals (file.Extension))? –

+0

Twój wpis pomógł mi znaleźć odpowiedź na mój problem: publiczne wyliczenie Coś {John, Rob, Tim} var msg = "Lubię Tima, on jest dobry"; var isOk = Enum.GetNames (typeof (Something)). Any (x => msg.Contains (x.ToString())); –

0

Można to zrobić z typem System.Enum:

string extension = Enum.GetName(typeof(FileExtensions), FileExtensions.mp3); 

if (extension == file.Extension) 
    // do something here 

Aktualizacja:

Ach, błędnie rozumieć, że chcesz sprawdzić całe wyliczenie dla rozszerzenia, a nie, czy określona wartość wyliczeniowa jest zgodna z rozszerzeniem. W takim przypadku Twoim podejściem jest GetNames() - nie możesz zaznaczyć własnej odpowiedzi jako zaakceptowanej na własne pytanie. ;-)

+0

To sprawdzi, czy mój plik ma takie dokładne rozszerzenie.Jeśli chciałem to sprawdzić, mógłbym również zrobić, jeśli (file.Extension.equals (FileExtensions.Mp3.ToString()) [untested] –

1

można rozszerzyć rodzaj FileInfo z następującą metodę rozszerzenia:

public static bool HasExtension(this FileInfo file) 
{ 
    var ext = file.Extension.StartsWith(".") ? file.Extension.Substring(1) 
              : file.Extension; 

    return Enum.GetNames(typeof(FileExtensions)) 
       .Any(f => f.Equals(ext)); 
} 

i używać go lubię:

bool hasExtension = file.HasExtension(); 
0

Enum.IsDefined wykona ciąg znaków zawierający nazwę wartości wyliczeniowej. Jedynym brzydota jest to, że trzeba rozebrać wiodącą okres off File.Extension i to jest wielkość liter:

Enum.IsDefined(typeof(FileExtension), file.Extension.Substring(1).ToLower()) 

Edit: Rozszerzenie metoda dobroć zbliżyć się do żądanej składnię:

IEnumerable<string> GetNames(this Type t) { 
    if (!t.IsEnum) throw new ArgumentException(); 

    return Enum.GetNames(t); 
} 

typeof(FileExtensions).GetNames().Any(e=>e.ToString().Equals(file.Extension)); 

Osobiście, chociaż , Wolałbym już trasę IsDefined:

bool IsDefined(this Type t, string name) { 
    if (!t.IsEnum) throw new ArgumentException(); 

    return Enum.IsDefined(t, name); 
} 

typeof(FileExtension).IsDefined(file.Extension); 
0

Najlepszym sposobem jest użycie funkcji Enum.IsDefined. To całkiem proste, w twoim przypadku:

if (Enum.IsDefined(typeof(FileExtentions), file.Extension)) 
+1

Sprawdź @Mark Brackett odpowiedź –

Powiązane problemy