移除枚举中指定的项

zw880322 2010-12-14 02:17:10
我有一个枚举属性控制窗体上的按钮显示与否。
现在有一个问题。
比如我的这个属性是
English.A | English.B | English.C
那么我如何把其中的English.B给去掉呢
...全文
383 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zw880322 2010-12-14
  • 打赏
  • 举报
回复

用了下,button &= ~English.B和button = button ^ English.B可以得出相同的结果。
但是button = button ^ English.B会在没有English.B的情况下把English.B给加上。
button &= ~English.B就没有这个问题
兔子-顾问 2010-12-14
  • 打赏
  • 举报
回复
写完整给你,再看不懂不解释了。

public static void Test()
{
English t = English.A | English.B | English.C;
Console.WriteLine((int)(t & English.B));
t &= ~English.B;//去掉B
Console.WriteLine((int)(t & English.B));
}

public enum English
{
A = 1,
B = 2,
C = 8,
D = 16,
E = 32,
F = 64
}
兔子-顾问 2010-12-14
  • 打赏
  • 举报
回复
例子中的A是0,0|2结果不是2么?
zw880322 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hztltgg 的回复:]
引用 12 楼 wuyazhe 的回复:
C# code
public static void Test()
{
English t = English.A | English.B | English.C;
Console.WriteLine((int)(t & English.B));
t &= ~English.B;//去掉B
Console.Wr……
[/Quote]

不行的
我运行测试了一下
最后得到的t只有一个English.C了,English.A这个值没有了
兔子-顾问 2010-12-14
  • 打赏
  • 举报
回复
怎么叫行不通?算了。你认为异或就是去掉某个位,那你就那么写把。
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyazhe 的回复:]
C# code
public static void Test()
{
English t = English.A | English.B | English.C;
Console.WriteLine((int)(t & English.B));
t &= ~English.B;//去掉B
Console.WriteLine((int)(……
[/Quote]

~ 取反是正确的,我刚才想着除了B都加起来,其实取反就可以了
zw880322 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wuyazhe 的回复:]
C# code
public static void Test()
{
English t = English.A | English.B | English.C;
Console.WriteLine((int)(t & English.B));
t &= ~English.B;//去掉B
Console.WriteLine((int)(……
[/Quote]

你这个没用吧
我用了一下
根本就行不通
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zw880322 的回复:]
我晕。。
我要的不是你那个做法!
那样的话我会累死。

不同的入口会造成button拥有不同的值。
按照你那样做。我需要根据每个入口写上不同的&代码。你不觉得工作量太大了点??
要知道我的枚举有30多个项呢?!!
[/Quote]

枚举加一个全部|或 好的值就可以简化了,^ 是异或,只有你确保button已经有English.B是正确的,如果没有那就反了

兔子-顾问 2010-12-14
  • 打赏
  • 举报
回复
public static void Test()
{
English t = English.A | English.B | English.C;
Console.WriteLine((int)(t & English.B));
t &= ~English.B;//去掉B
Console.WriteLine((int)(t & English.B));
}

public enum English { A, B, C, D, E, F }
zw880322 2010-12-14
  • 打赏
  • 举报
回复
不容易,找了这么久,总算找到要怎么写了。
就一句代码的:
button = button ^ English.B
zw880322 2010-12-14
  • 打赏
  • 举报
回复
我晕。。
我要的不是你那个做法!
那样的话我会累死。

不同的入口会造成button拥有不同的值。
按照你那样做。我需要根据每个入口写上不同的&代码。你不觉得工作量太大了点??
要知道我的枚举有30多个项呢?!!
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
我说的

如果有很多就要全部都或上

是说把这个枚举里的值全部写上,不是那个按钮以及赋过的值全部加上
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
这个就是位运算,不能通过减号来实现,除非去另外的运算符重载
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
我的答案就是你的需求啊

zw880322 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hztltgg 的回复:]
( English.A |English.C) 这个是你的例子里呀,如果有很多就要全部都或上,除了那个B不加,就是让B这个位为0,其他都要为1,然后去和原值&
[/Quote]

我要说的是button这个变量是有不特定数量的枚举值。可能有3个也可能只有1个。
但是English.B是必然存在的。
现在的需求是在特定的时候将English.B这个值给移除
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
( English.A |English.C) 这个是你的例子里呀,如果有很多就要全部都或上,除了那个B不加,就是让B这个位为0,其他都要为1,然后去和原值&
zw880322 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hztltgg 的回复:]
你的枚举加flag了没?加了的话

s=s & ( English.A |English.C)
[/Quote]

加了flag。
但是这种办法不行呢。
button 这个参数的枚举项会有不同的值。
我只能确定有English.B,其他的按照不同的方式会有不同的枚举值
hztltgg 2010-12-14
  • 打赏
  • 举报
回复
你的枚举加flag了没?加了的话

s=s & ( English.A |English.C)
zw880322 2010-12-14
  • 打赏
  • 举报
回复
开始的时候: button = English.A | English.B | English.C
然后我需要在代码里面修改button的值
将其改成
button = English.A | English.C
这个该怎么做?
戒指 2010-12-14
  • 打赏
  • 举报
回复
看不懂是什么意思,在说清楚一点啊!

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧