clase - Determinar si el valor enum está en la lista(C#)
enum in model c# (6)
Estoy construyendo una pequeña aplicación divertida para determinar si debo ir en bicicleta al trabajo.
Me gustaría probar para ver si está lloviendo o tormenta (ing).
public enum WeatherType : byte
{ Sunny = 0, Cloudy = 1, Thunderstorm = 2, Raining = 4, Snowing = 8, MostlyCloudy = 16 }
Estaba pensando que podría hacer algo como:
WeatherType _badWeatherTypes = WeatherType.Thunderstorm | WeatherType.Raining;
if(currentWeather.Type == _badWeatherTypes)
{
return false;//don''t bike
}
pero esto no funciona porque _badWeatherTypes es una combinación de ambos tipos. Me gustaría mantenerlos separados porque se supone que es una experiencia de aprendizaje y tenerla separada puede ser útil en otras situaciones (IE, Factura no pagada, etc.).
También preferiría no hacerlo: (esto eliminaría la posibilidad de configurarse para varias personas)
if(WeatherType.Thunderstorm)
{
return false; //don''t bike
}
etc...
Deberías usar el atributo Flags en tu enumeración. Más allá de eso, también debes probar para ver si una bandera en particular está configurada por:
(currentWeather.Type & WeatherType.Thunderstorm == WeatherType.Thunderstorm)
Esto probará si currentWeather.Type tiene el indicador WeatherType.Thunderstorm establecido.
Necesita usar el atributo [Flags] ( marque aquí ) en su enumeración; luego puede usar bitwise y verificar si hay coincidencias individuales.
No me limitaría al mundo de bits. Los enums y los operadores bit a bit son, como descubriste, no lo mismo. Si quieres resolver esto usando operadores bit a bit, me quedaré solo con ellos, es decir, no te molestes con enumeraciones. Sin embargo, me gustaría algo como lo siguiente:
WeatherType[] badWeatherTypes = new WeatherType[]
{
WeatherType.Thunderstorm,
WeatherType.Raining
};
if (Array.IndexOf(badWeatherTypes, currentWeather.Type) >= 0)
{
return false;
}
Su código actual dirá si está exactamente "lloviendo". Para saber si está "lloviendo y atronador, y posiblemente algo más", necesita:
if ((currentWeather.Type & _badWeatherTypes) == _badWeatherTypes)
Para saber si está "lloviendo o cayendo, y posiblemente algo más", necesita:
if ((currentWeather.Type & _badWeatherTypes) != 0)
EDITAR (para completar):
Sería bueno usar FlagsAttribute
, es decir, decorar el tipo con [Flags]
. Esto no es necesario por el bien de esta lógica bit a bit, sino que afecta cómo se comporta ToString()
. El compilador de C # ignora este atributo (al menos por el momento, la especificación de C # 3.0 no lo menciona), pero en general es una buena idea para enumeraciones que son efectivamente indicadores y documenta el uso previsto del tipo. Al mismo tiempo, la convención es que cuando usa banderas, plurales el nombre enum, por lo que lo cambiaría a WeatherTypes
(porque cualquier valor real es efectivamente 0 o más tipos de clima).
También valdría la pena pensar en lo que realmente significa "Sunny". Actualmente tiene un valor de 0, lo que significa que es la ausencia de todo lo demás; no podrías tenerlo soleado y lloviendo al mismo tiempo (lo cual es físicamente posible, por supuesto). ¡Por favor, no escriba código para prohibir arcoiris! ;) Por otro lado, si en su caso de uso real realmente quiere un valor que significa "la ausencia de todos los demás valores", entonces está bien.
usa FlagsAttribute. Eso te permitirá usar la enumeración como máscara de bits.
No estoy seguro de que deba ser una bandera, creo que debería tener una entrada de rango para:
- Temperatura
- Cuanto esta lloviendo
- Fuerza del viento
- cualquier otra entrada que desee (por ejemplo, tormenta eléctrica)
luego puede usar un algoritmo para determinar si las condiciones son lo suficientemente buenas.
Creo que también debería tener una opinión sobre la probabilidad de que el clima siga siendo el mismo para ir en bicicleta a casa. Los criterios pueden ser diferentes: puede ducharse y cambiar más fácilmente cuando llegue a casa.
Si realmente desea hacerlo interesante, recopile los datos de entrada de una API del servicio meteorológico y evalúe la decisión todos los días. Sí, debería haber hecho un ciclo, o no, fue un error. Entonces, quizás puedas hacer que la aplicación aprenda a tomar mejores decisiones.
El siguiente paso es "socializar" su decisión y ver si otras personas oyen que está tomando las mismas decisiones.