当前位置:  开发笔记 > 编程语言 > 正文

确定枚举值是否在列表中(C#)

如何解决《确定枚举值是否在列表中(C#)》经验,为你挑选了1个好方法。

我正在构建一个有趣的小应用程序,以确定我是否应该自行车上班.

我想测试看它是下雨还是雷雨(ing).

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

我以为我可以这样做:

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

但这不起作用,因为_badWeatherTypes是两种类型的组合.我想将它们分开,因为这应该是一种学习经验,并且将它分开可能在其他情况下有用(IE,Invoice not paid reason's etc ...).

我也不愿意这样做(这会删除为多人配置的能力)

if(WeatherType.Thunderstorm)
{
 return false; //don't bike
}
etc...

Jon Skeet.. 18

您当前的代码会说无论是正是 "降雨及雷暴".要了解它是否需要"下雨,雷雨,可能还有别的东西":

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

要了解它是否需要"下雨雷雨,可能还有别的东西":

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

编辑(完整性):

最好使用FlagsAttribute,即装饰类型[Flags].对于这种按位逻辑,这不是必需的,但会影响ToString()行为方式.C#编译器忽略了这个属性(至少在目前; C#3.0规范没有提到它),但对于有效标记的枚举通常是一个好主意,它记录了该类型的预期用途.同时,惯例是当你使用标志时,你将枚举名称复数 - 所以你要将它改为WeatherTypes(因为任何实际值实际上是0或更多天气类型).

还有必要考虑"Sunny"的真正含义.它目前的值为0,这意味着它缺少其他一切; 你不能在阳光下和同时下雨(当然这在物理上是可能的).请不要编写代码来禁止彩虹!;)另一方面,如果在您的真实用例中,您真正想要一个意味着"缺少所有其他价值"的价值,那么您就没事了.



1> Jon Skeet..:

您当前的代码会说无论是正是 "降雨及雷暴".要了解它是否需要"下雨,雷雨,可能还有别的东西":

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

要了解它是否需要"下雨雷雨,可能还有别的东西":

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

编辑(完整性):

最好使用FlagsAttribute,即装饰类型[Flags].对于这种按位逻辑,这不是必需的,但会影响ToString()行为方式.C#编译器忽略了这个属性(至少在目前; C#3.0规范没有提到它),但对于有效标记的枚举通常是一个好主意,它记录了该类型的预期用途.同时,惯例是当你使用标志时,你将枚举名称复数 - 所以你要将它改为WeatherTypes(因为任何实际值实际上是0或更多天气类型).

还有必要考虑"Sunny"的真正含义.它目前的值为0,这意味着它缺少其他一切; 你不能在阳光下和同时下雨(当然这在物理上是可能的).请不要编写代码来禁止彩虹!;)另一方面,如果在您的真实用例中,您真正想要一个意味着"缺少所有其他价值"的价值,那么您就没事了.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有