Die Auswahl enum-Werte basierend auf den Schlüssel-Namen
Ich habe eine enum die ungefähr so:
public enum Animals
{
CatOne = 12,
CatTwo = 13,
CatThree = 14,
DogOne = 21,
DogTwo = 22
};
Toll.
Nun möchte ich, um die Werte aller Katzen.. Was ich versuche zu tun, ist dies:
public static int[] GetCatValues()
{
List<int> catValues = new List<int>();
foreach(var cat in Enum.GetNames(typeof(Animals)))
{
Animals animal;
if(cat.StartsWith("Cat"))
{
Enum.TryParse(cat, out animal);
catValues.Add((int)animal);
}
}
return catValues.ToArray();
}
Das funktioniert, okay. Außer dass es hässlich aussieht. Warum kann ich nicht etwas tun, wie
Animals
.Select(r => (int)r)
.Where(r => r.StartsWith("Cat"))
.ToArray();
Ich weiß, dass funktioniert nicht. So gibt es einen besseren Weg, um alle Werte des enum beginnt damit, dass sich bestimmte Zeichenfolge.
Ich weiß, ich könnte wahrscheinlich mit regex, Fehlalarme zu vermeiden, aber ich bin es einfach zu halten, für jetzt.
Dank.
r.ToString().StartsWith("Katze"))
Warum sind Sie versuchen, den Wert aller Hunde durch die Suche für die Einträge, die beginnen mit
warum würden Sie wollen, verwenden Sie die RegEx-Sie können dies erreichen, mit
oops, ich war der Bau die Frage, wie ich tippte, es ist also eine brin-fo (ähnlich Tippfehler, aber mit einem Fehltritt in meinem Gehirn)
Kann Ich? Ich wusste nicht, dass dies ist, was ich versuche zu finden Sie hier!
Warum sind Sie versuchen, den Wert aller Hunde durch die Suche für die Einträge, die beginnen mit
cat
?warum würden Sie wollen, verwenden Sie die RegEx-Sie können dies erreichen, mit
Linq
oops, ich war der Bau die Frage, wie ich tippte, es ist also eine brin-fo (ähnlich Tippfehler, aber mit einem Fehltritt in meinem Gehirn)
Kann Ich? Ich wusste nicht, dass dies ist, was ich versuche zu finden Sie hier!
InformationsquelleAutor LocustHorde | 2013-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Kompromiss Satz von code - es ist nicht so sauber wie das, was Sie suchen, aber es ist weit besser als die foreach-Schleife-version.
Jetzt bin ich verwirrt, welche Antwort ich sollte es akzeptieren, so oder Jon Skeet ist
Ich würde lieben, wenn Sie akzeptiert mir, da kam ich auf diese Antwort zunächst, aber Jon ist
Ich landete mit dieser Antwort, bevor Jon Skeet version dieses kam, (später geändert mit Jon Skeet Vorschlag von
Cast
stattOfType
), so wähle ich diese Antwort. Danke.InformationsquelleAutor Bobson
Wohl der einfachste Ansatz ist, einfach den Namen mit
ToString
:Oder mit
Cast<>
zu vermeiden, die Besetzung zuAnimals[]
:(Ich bevorzuge
Cast<>
zuOfType<>
hier, wie wir wirklich sind erwartet jeden WertAnimals
- wenn nicht, ist eine Ausnahme durchaus angebracht!)Jedoch, dies alles fühlt sich etwas eklig an mir zu befestigen Bedeutung, um die Namen der enum-Werte fühlt sich immer ein bisschen haarig, und der Analyse bestimmter bits der Namen noch mehr. Vielleicht möchten Sie versuchen, die Dekoration zu jedem Wert ein Attribut angeben, eine "Gruppe".
Ich würde auch empfehlen den Aufruf der enum -
Animal
eher alsAnimals
- only-flag-enums basieren, sollte in der Regel im plural, und "eine Sammlung vonAnimals
Werte" klingt ausgesprochen seltsam.(Auch, können Sie möchten schauen sich meine Ungezwungen Melodie Projekt ermöglicht für Typ-sicheren, effizienten, generischen Zugriff auf Enumerationen, die über generische constraints, die legal in ILLINOIS, kann aber nicht ausgedrückt werden in C#...)
.Where()
auf einen enum-Typ direkt.Animals.Where()
existiert nicht.Doh, ich hatte angenommen
Animals
war bereits eine Eigenschaft der Rückkehr alle Tiere. - Bearbeitung...es muss eine zusätzliche Klammern in der ersten Zeile else return wird versucht, zurück
Animals[]
selbst.. also erste Zeile =return ((Animals[])Enum.GetValues(typeof(Animals))).Where....
Ich habe nun enthalten eine version mit
Cast
- und meine Argumentation fürCast
überOfType
.Gute Argumentation. Und ich Stimme auf jeden Fall über die Ableitung der Bedeutung aus dem Namen der enum.
InformationsquelleAutor Jon Skeet
Besseren Weg, dies zu tun wäre durch die Verwendung von flags.
Natürlich wird dies nur funktionieren, wenn Sie in der Lage sind zu nummerieren Ihre enum, und ohne genau zu wissen, was Sie tun müssen, um diese Werte ist es schwer zu sagen, ob es passen würde oder nicht.
Oh, ich brauche, um zu vergleichen, meine enum-Wert mit der
AllCats
Wert.. hm, ich bin versucht, etwas zu tun etwas anders also würde ich brauchen, um eine Kreuzung von zwei Enumerationen, so würde dies nicht für meinen Zweck jetzt!Die Werte aller Katzen sind in
AllCats
. Sie sindOR
ed zusammen. Um zu testen, ob ein bestimmter Wert eine Katze, Sie möchte etwas tun, wieAnimals.AllCats & myValue == myValue
. Dies wird als true ausgewertet werden, wennmyValue
ist eine Katze.Ja, ich kann das sehen, aber ich soll alle Werte und führen Sie eine Kreuzung mit einem anderen enum-also für diesen Fall zumindest ist es nicht akzeptabel.. Aber vielen Dank für diese, ich wusste nicht, ich könnte es! +1
InformationsquelleAutor Matt Burland
Etwas hässlich, aber kann für Ihren Fall:
In diesem Fall, die Katzen werden die tatsächlichen Enums und nicht zahlen.
InformationsquelleAutor Mikael Östberg