.NET 6中如何用紧凑if语句实现非布尔类型的多值比较
在.NET 6中实现枚举/数值类型的紧凑多值判断
直接用a || b的写法行不通,因为||是布尔逻辑运算符,会先把枚举/数值类型转换成布尔值(非零为true,零为false),最终得到的是布尔结果,没法和原类型的变量做相等判断。针对你的枚举场景,有几种紧凑的实现方式:
方式1:使用集合的Contains方法
把要判断的枚举值放进临时集合,用Contains完成判断,代码简洁直观:
if (new[] { Animal.Dolphin, Animal.Whale }.Contains(choice)) { Console.WriteLine("Lives in the sea"); }
如果需要重复使用该判断逻辑,可将集合定义为静态只读变量,避免每次创建新集合:
private static readonly HashSet<Animal> SeaAnimals = new() { Animal.Dolphin, Animal.Whale }; // 使用时 if (SeaAnimals.Contains(choice)) { Console.WriteLine("Lives in the sea"); }
方式2:使用模式匹配(.NET 6+支持)
利用.NET 6增强的模式匹配语法,直接在if条件中写多值匹配,语法最紧凑:
if (choice is Animal.Dolphin or Animal.Whale) { Console.WriteLine("Lives in the sea"); }
这种写法无需额外创建集合,是.NET 6及以后推荐的简洁实现方式,可读性与性能表现都很出色。
方式3:按位或(仅适用于标记枚举)
如果你的枚举是标记枚举(需用[Flags]特性修饰,且枚举值为2的幂),可以用按位或|配合按位与&判断,但当前Animal枚举不符合标记枚举定义,因此该方式不适用。若后续调整为标记枚举,写法如下:
[Flags] enum Animal : byte { Cat = 1, Dog = 2, Cow = 4, Dolphin = 8, Horse = 16, Whale = 32 } // 判断逻辑 if ((choice & (Animal.Dolphin | Animal.Whale)) != 0) { Console.WriteLine("Lives in the sea"); }
综上,最适配你场景的是模式匹配的is ... or ...写法,完全满足你想要的紧凑if语句需求,无需使用switch。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

