Ermitteln, ob enum-Wert in Liste ist (C #)

8

Ich baue eine lustige kleine App, um festzustellen, ob ich mit dem Fahrrad zur Arbeit fahren sollte.

Ich möchte testen, ob es regnet oder Gewitter ist.

%Vor%

Ich dachte, ich könnte etwas tun wie:

%Vor%

Dies funktioniert jedoch nicht, da _badWeatherTypes eine Kombination beider Typen ist. Ich möchte sie getrennt halten, weil dies eine Lernerfahrung sein soll, und das Trennen davon kann in anderen Situationen nützlich sein (IE, Rechnung nicht bezahlt, Grund usw.).

Ich würde es auch nicht tun: (das würde die Fähigkeit für mehrere Personen zu konfigurieren) entfernen

%Vor%     
Nathan Koop 02.10.2008, 20:29
quelle

6 Antworten

18

Dein aktueller Code wird sagen, ob es genau "regnet und gewittrig" ist. Um herauszufinden, ob es "regnet und Gewitter und möglicherweise etwas anderes", brauchen Sie:

%Vor%

Um herauszufinden, ob es regnet oder Gewitter, und möglicherweise etwas anderes "Sie brauchen:

%Vor%

EDIT (zur Vollständigkeit):

Es wäre gut, FlagsAttribute zu verwenden, also den Typ mit [Flags] zu dekorieren. Dies ist für diese bitweise Logik nicht notwendig, sondern beeinflusst, wie sich ToString() verhält. Der C # -Compiler ignoriert dieses Attribut (zumindest im Moment; die C # 3.0-Spezifikation erwähnt es nicht), aber es ist im Allgemeinen eine gute Idee für Enums, die effektiv Flags sind, und dokumentiert die beabsichtigte Verwendung des Typen. Zur gleichen Zeit ist die Konvention, dass wenn Sie Flags verwenden, Sie den enum-Namen pluralisieren - also würden Sie ihn in WeatherTypes ändern (weil jeder tatsächliche Wert effektiv 0 oder mehr Wettertypen ist).

Es lohnt sich auch darüber nachzudenken, was "Sunny" wirklich bedeutet. Es hat momentan einen Wert von 0, was bedeutet, dass alles andere fehlt; Man konnte es nicht gleichzeitig sonnig und regnen lassen (was natürlich physisch möglich ist). Bitte schreibe keinen Code, um Regenbögen zu verbieten! ;) Auf der anderen Seite, wenn Sie in Ihrem realen Anwendungsfall wirklich einen Wert wollen, der "die Abwesenheit aller anderen Werte" bedeutet, dann geht es Ihnen gut.

    
Jon Skeet 02.10.2008, 20:35
quelle
2

Ich bin mir nicht sicher, ob es eine Flagge sein sollte - ich denke, dass Sie eine Bereichseingabe für:

haben sollten
  • Temperatur
  • Wie viel es regnet
  • Windstärke
  • jede andere Eingabe, die Ihnen gefällt (z. B. Gewitter)

Sie können dann einen Algorithmus verwenden, um festzustellen, ob die Bedingungen ausreichend gut sind.

Ich denke, Sie sollten auch wissen, wie wahrscheinlich es ist, dass das Wetter für den Heimweg gleich bleibt. Die Kriterien können anders sein - Sie können duschen und leichter wechseln, wenn Sie nach Hause kommen.

Wenn Sie es wirklich interessant machen wollen, sammeln Sie die Eingabedaten von einer Wetterdienst-API und bewerten Sie die Entscheidung jeden Tag - Ja, ich hätte radeln sollen oder nicht, es war ein Fehler. Dann können Sie vielleicht die App lernen, bessere Entscheidungen zu treffen.

Der nächste Schritt besteht darin, Ihre Entscheidung zu "sozialisieren" und zu sehen, ob andere Leute hören, dass Sie die gleichen Entscheidungen treffen.

    
LawrenceF 09.11.2011 15:36
quelle
1

Verwenden Sie das FlagsAttribute. Dadurch können Sie die Enumeration als Bitmaske verwenden.

    
MagicKat 02.10.2008 20:31
quelle
0

Sie müssen das Attribut [Flags] verwenden ( hier ) auf deiner enum; dann können Sie bitweise und nach einzelnen Übereinstimmungen suchen.

    
David Alpert 02.10.2008 20:35
quelle
0

Sie sollten das Attribut Flags in Ihrer Enumeration verwenden. Darüber hinaus müssen Sie testen, ob ein bestimmtes Flag gesetzt ist durch:

%Vor%

Dies wird testen, ob currentWeather.Type das WeatherType.Thunderstorm Flag gesetzt hat.

    
Scott Dorman 02.10.2008 20:37
quelle
0

Ich würde mich nicht auf die Bit-Welt beschränken. Enums und bitweise Operatoren sind, wie Sie herausgefunden haben, nicht dasselbe. Wenn Sie dies mit bitweisen Operatoren lösen wollen, bleibe ich bei ihnen, d. H. Ich kümmere mich nicht um enums. Ich würde jedoch so etwas wie folgt haben:

%Vor%     
Ken Wootton 02.10.2008 21:01
quelle

Tags und Links