C#扩展——枚举的|位算,将选项快速组合起来



一.开发环境

语言:C#


二.问题描述

多个枚举值进行筛选和组合时,如何使用|快速组合.例如五个颜色想组合其中三个为一个选项,进行筛选.


三.解决方案原理及代码

实现原理:

在下面的代码中,使用了 | 运算符将 Red、Green、Blue、Yellow 和 Black 这五个常量组合起来,形成一个标志位 colors,表示需要筛选的颜色。(简单理解为colors包含五个颜色选项)
在筛选时,使用 & 运算符将物品的颜色与 colors 进行按位与运算,如果结果不为 0,则表示物品的颜色包含在 colors 中,符合筛选条件。(二进制的比较.使用按位与(&)运算符得到的结果比较是否为0.按位与(&)运算符是将两个整型数的对应二进制位进行“与”运算:)

对应代码:

例子1:


enum Color
{
    Red = 1,
    Green = 2,
    Blue = 4,
    Yellow = 8,
    Black = 16
}

List<Item> items = GetItemList(); // 获取物品列表

// 筛选出颜色为 Red、Green、Blue、Yellow 或 Black 的物品
Color colors = Color.Red | Color.Green | Color.Blue | Color.Yellow | Color.Black;
List<Item> filteredItems = items.Where(i => (i.Color & colors) != 0).ToList();

例子2:
假设有三个颜色对应的二进制值为:

Color colors = Color.Red | Color.Green | Color.Blue; // 需要筛选的三种颜色为 Red、Green、Blue
List<Item> filteredItems = items.Where(i => (i.Color & colors) != 0).ToList(); // 筛选颜色包含在 colors 中的物品

原理:

Red: 0001
Green: 0010
Blue: 0100
然后将这三个值用 | 运算符组合起来,得到一个标志位 colors,其二进制值为:

colors: 0111
然后,假设有一个物品,它的颜色对应的二进制值为:

ItemColor: 0010
然后将 ItemColor 与 colors 进行按位与(&)运算:

ItemColor & colors: 0010 & 0111 = 0010
通过按位与(&)运算得到的结果是一个整型数,其二进制值为 0010,这意味着第二位(对应 Green 颜色)是 1,而其他位都是 0。这表示该物品的颜色包含 Green,符合筛选条件。如果按位与的结果为0,则说明该物品的颜色不包含在筛选条件中。

注意事项:
在枚举类型中,每个常量的值必须是 2 的幂次方,这样才能保证每个常量的二进制表示中只有一个位为 1。这样才能使用 | 运算符将多个常量组合成一个标志位。在上面的代码中,为了方便起见,使用了 1、2、4、8、16 这些常量值,它们都是 2 的幂次方。

四.总结

保持饥饿,保持愚蠢.
这世界唯一能够相信的就是你付出的努力和你走过的路.

05-30 05:44