Question

Je construis une petite application amusante pour déterminer si je devrais me rendre au travail à vélo.

Je voudrais tester pour voir s'il s'agit de Raining ou Thunderstorm (ing).

public enum WeatherType : byte
{ Sunny = 0, Cloudy = 1, Thunderstorm = 2, Raining = 4, Snowing = 8, MostlyCloudy = 16 }

Je pensais pouvoir faire quelque chose comme:

WeatherType _badWeatherTypes = WeatherType.Thunderstorm | WeatherType.Raining;
if(currentWeather.Type == _badWeatherTypes)
{
 return false;//don't bike
}

mais cela ne fonctionne pas car _badWeatherTypes est une combinaison des deux types. Je voudrais les séparer parce que cela est supposé être une expérience d'apprentissage et le séparer peut être utile dans d'autres situations (IE, facture non plus, etc.).

Je préférerais aussi ne pas faire: (cela supprimerait la possibilité d'être configuré pour plusieurs personnes)

if(WeatherType.Thunderstorm)
{
 return false; //don't bike
}
etc...
Était-ce utile?

La solution

Votre code actuel indiquera s'il s'agit de exactement "pleuvoir et tonnerre". Pour savoir s’il "pleut et est orageux et peut-être autre chose" vous avez besoin de:

if ((currentWeather.Type & _badWeatherTypes) == _badWeatherTypes)

Pour savoir s'il "pleut ou tonnerre, et éventuellement autre chose" vous avez besoin de:

if ((currentWeather.Type & _badWeatherTypes) != 0)

EDIT (pour compléter):

Il serait bon d’utiliser le FlagsAttribute , c’est-à-dire décorer le type avec [Flags] . Cela n'est pas nécessaire pour des raisons de logique logique au niveau du bit, mais affecte le comportement de ToString () . Le compilateur C # ignore cet attribut (du moins pour le moment; la spécification C # 3.0 ne le mentionne pas), mais c'est généralement une bonne idée pour les énumérations qui sont effectivement des indicateurs et il documente l'utilisation prévue du type. En même temps, la convention veut que lorsque vous utilisez des drapeaux, vous pluralisez le nom de l’énum. Vous devez donc le remplacer par WeatherTypes (car toute valeur réelle est en réalité égale à 0 ou à plusieurs types de temps).

Il serait également utile de réfléchir à ce que "& Sunny" signifie vraiment. Il a actuellement une valeur de 0, ce qui signifie que c'est l'absence de tout le reste; il ne pouvait pas y avoir du soleil et de la pluie en même temps (ce qui est physiquement possible, bien sûr). S'il vous plaît, n'écrivez pas de code pour interdire les arcs-en-ciel! ;) D'autre part, si dans votre cas d'utilisation réel, vous voulez réellement une valeur qui signifie "l'absence de toutes les autres valeurs". alors tu vas bien.

Autres conseils

Je ne suis pas sûr que cela devrait être un drapeau - je pense que vous devriez avoir une entrée de plage pour:

  • température
  • Combien il pleut
  • Force du vent
  • toute autre entrée que vous aimez (par exemple, un orage)

vous pouvez ensuite utiliser un algorithme pour déterminer si les conditions sont suffisamment bonnes.

Je pense que vous devriez également avoir une idée de la probabilité que le temps reste le même pour le cyclisme à la maison. Les critères peuvent être différents - vous pouvez prendre une douche et changer plus facilement quand vous rentrez chez vous.

Si vous voulez vraiment que cela soit intéressant, collectez les données d'entrée à partir d'une API de service météorologique et examinez chaque jour la décision. Oui, j'aurais dû pédaler, ou non, c'était une erreur. Ensuite, vous pourrez peut-être faire en sorte que l'application apprenne à prendre de meilleures décisions.

La prochaine étape consiste à "socialiser". votre décision et voyez si d’autres personnes vous entendent prendre les mêmes décisions.

utilisez le FlagsAttribute. Cela vous permettra d’utiliser l’énum en tant que masque de bits.

Vous devez utiliser l'attribut [Flags] ( check ici ) sur votre enum; alors vous pouvez utiliser au niveau des bits et vérifier les correspondances individuelles.

Vous devriez utiliser l'attribut Flags sur votre enum. Au-delà, vous devez également vérifier si un indicateur particulier est défini par:

(currentWeather.Type & WeatherType.Thunderstorm == WeatherType.Thunderstorm)

Ceci testera si currentWeather.Type a l'indicateur WeatherType.Thunderstorm défini.

Je ne me limiterais pas au monde des bits. Les énumérations et les opérateurs de bits ne sont, comme vous l'avez découvert, pas la même chose. Si vous voulez résoudre ce problème à l’aide d’opérateurs au niveau des bits, je n’en resterais qu’à eux, c’est-à-dire qu’il ne faut pas s’embêter avec des énumérations. Cependant, je voudrais quelque chose comme ce qui suit:

        WeatherType[] badWeatherTypes = new WeatherType[]
        {   
            WeatherType.Thunderstorm, 
            WeatherType.Raining
        };

        if (Array.IndexOf(badWeatherTypes, currentWeather.Type) >= 0)
        {
                        return false;
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top