枚举回值的问题!

java__net 2010-06-04 05:55:38
定义一个枚举
[flags]
enum State
{
add = 1;
edit = 2;
del = 4;
}

如果我赋值给一个变量 State.add|State.edit的int值,为3,
当我想把3返回成State[]该怎么做?
...全文
136 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
java__net 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 qldsrx 的回复:]
把你的测试用enum贴出来,除非enum中含有0,除非你的测试方法和我的有出入,否则不可能有0在里面。
代码是执行过才贴出来的,不可能到了你的机器上就不一样了。
[/Quote]

恩,是的,我的代码有,贴的时候没写,这个怪我,不好意思。
qldsrx 2010-06-07
  • 打赏
  • 举报
回复
把你的测试用enum贴出来,除非enum中含有0,除非你的测试方法和我的有出入,否则不可能有0在里面。
代码是执行过才贴出来的,不可能到了你的机器上就不一样了。
java__net 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qldsrx 的回复:]
你是在分析的基础上推测的吧,请实际执行下看看倒底对不对,为0是什么都不会输出的,而且你的分析本身就是错误的。

tt & type 是按位与运算,如果tt中包含了type这个枚举值,那么运算的结果就是type本身,所以肯定相等,如果tt中不含有type这个枚举值,那么运算的结果就是0了,也就不会相等。
[/Quote]

你返回的数组里,会有0,本来应该返回含有2个元素的数组,但实际返回的是3个,这些代码我都会测试,至于与或的逻辑分析,是我推断的,因为我一直没理解了与或概念
qldsrx 2010-06-07
  • 打赏
  • 举报
回复
你是在分析的基础上推测的吧,请实际执行下看看倒底对不对,为0是什么都不会输出的,而且你的分析本身就是错误的。

tt & type 是按位与运算,如果tt中包含了type这个枚举值,那么运算的结果就是type本身,所以肯定相等,如果tt中不含有type这个枚举值,那么运算的结果就是0了,也就不会相等。
java__net 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qldsrx 的回复:]
引用 8 楼 java__net 的回复:
那要是State.add | State.edit | State.del呢,或者更多的枚举与操作,怎么返回?

一样返回,你测试过了吗?我可没有限制只有两个。
反而你自己写的我看不懂,right变量哪里来的?整型的state参数传入后却没有使用到,难道我眼拙?你倒底是想做什么,自己的答案明显是答非所问。
[/Quote]

还有一个逻辑上的问题,我没搞懂,想问个清楚。



if ((tt & type) == type)


这句里,如果tt是3个值,不论与掉哪个值,都会剩下2个值,而type肯定是一个值,而这个枚举类中是不可能存在2个值相加等于其中任何一个值的,那也就是说,剩下任何2个值的或都不可能等于type,但最后的结果确实是把它们分出来了,而且还多分出了0值,这是为什么?
java__net 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qldsrx 的回复:]
引用 8 楼 java__net 的回复:
那要是State.add | State.edit | State.del呢,或者更多的枚举与操作,怎么返回?

一样返回,你测试过了吗?我可没有限制只有两个。
反而你自己写的我看不懂,right变量哪里来的?整型的state参数传入后却没有使用到,难道我眼拙?你倒底是想做什么,自己的答案明显是答非所问。
[/Quote]

如果在我有一个值是0的话,你的方法就会把0值显示出来,不能得到正确的结果,所以3个选项的我也就没式
java__net 2010-06-07
  • 打赏
  • 举报
回复

private static State[] States(int state)
{
string name = ((State)state).ToString();
string[] names = name.Split(',');
var values = Enum.GetValues(typeof(State));
List<State> sts = new List<State>();
foreach (State item in values)
{
for (int i = 0; i < names.Length; i++)
{
if (names[i].Trim()==item.ToString())
{
sts.Add(item);
}
}
}
return sts.ToArray();
}


right应该是state,我发完了才发现错误,可csdn不让我修改
qldsrx 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 java__net 的回复:]
那要是State.add | State.edit | State.del呢,或者更多的枚举与操作,怎么返回?[/Quote]

一样返回,你测试过了吗?我可没有限制只有两个。
反而你自己写的我看不懂,right变量哪里来的?整型的state参数传入后却没有使用到,难道我眼拙?你倒底是想做什么,自己的答案明显是答非所问。
java__net 2010-06-07
  • 打赏
  • 举报
回复

private static State[] States(int state)
{
string name = ((State)right).ToString();
string[] names = name.Split(',');
var values = Enum.GetValues(typeof(State));
List<State> sts = new List<State>();
foreach (State item in values)
{
for (int i = 0; i < names.Length; i++)
{
if (names[i].Trim()==item.ToString())
{
sts.Add(item);
}
}
}
return sts.ToArray();
}


这是我写的,可是用了遍历嵌套for循环,性能低下,还能优化么?
java__net 2010-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qldsrx 的回复:]
C# code
[Flags]
enum State
{
add = 1,
edit = 2,
del = 4
}

/////////测试代码,请写到方法中执行////////////////
State tt = State.add | State.edit;
……
[/Quote]

那要是State.add | State.edit | State.del呢,或者更多的枚举与操作,怎么返回?
tuo_li 2010-06-04
  • 打赏
  • 举报
回复
顶 学习一下
qldsrx 2010-06-04
  • 打赏
  • 举报
回复
    [Flags]
enum State
{
add = 1,
edit = 2,
del = 4
}

/////////测试代码,请写到方法中执行////////////////
State tt = State.add | State.edit;
var arry = Enum.GetValues(typeof(State));
List<State> sts = new List<State>();
foreach (State type in arry)
{
if ((tt & type) == type)
sts.Add(type);
}
sts.ToArray();//这就是你要的数组了。
xk1126 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzx509 的回复:]
C# code

List<State> states = new List<State>();
Array arr = Enum.GetValues(typeof(State));
State temp;
for (int i = 0; i < arr.Length; i++)
{
……
[/Quote]
up
wuyq11 2010-06-04
  • 打赏
  • 举报
回复
“|”:表示两边求并集元素相加,相同元素只出现一次
State s= (State)Enum.Parse(typeof(State), "");
All = add| Edit 可清除
zzx509 2010-06-04
  • 打赏
  • 举报
回复

List<State> states = new List<State>();
Array arr = Enum.GetValues(typeof(State));
State temp;
for (int i = 0; i < arr.Length; i++)
{
temp = (State)arr.GetValue(i);
if ((stateVal & temp) == temp)
{
states.Add(temp);
}
}

for (int i = 0; i < states.Count; i++)
{
Console.WriteLine(states[i]);
}
vrhero 2010-06-04
  • 打赏
  • 举报
回复
位标志,用逻辑运算符|和^...MSDN有例子,去看MSDN...

http://msdn.microsoft.com/zh-cn/library/cc138362(VS.90).aspx
dlsgliss 2010-06-04
  • 打赏
  • 举报
回复
友情帮顶!

111,125

社区成员

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

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

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