[Flags]
enum MultiHue{ Black = 0, Red = 1, Green = 2, Blue = 4}MultiHue a = MultiHue.Black | MultiHue.Green;
这里怎么写代码遍历a,得到Black和Green 2个结果
我想到的办法,除了switch 0,1,2,3,4,5,6,7之外,就是下面的方案了:
int b = (int)a;
while(b>0){
MultiHue c = (MultiHue)(b&1);
b = b >> 1;
}有没有更简单的,比如能不能直接foreach?
enum MultiHue{ Black = 0, Red = 1, Green = 2, Blue = 4}MultiHue a = MultiHue.Black | MultiHue.Green;
这里怎么写代码遍历a,得到Black和Green 2个结果
我想到的办法,除了switch 0,1,2,3,4,5,6,7之外,就是下面的方案了:
int b = (int)a;
while(b>0){
MultiHue c = (MultiHue)(b&1);
b = b >> 1;
}有没有更简单的,比如能不能直接foreach?
解决方案 »
- datatime转化想要的格式
- webBrowser 在编辑模式下,如何禁用 CTRL C 和 CTRL V
- 求助:c# 如何实现 键盘 “按键被释放才响应” 在线等
- 有关动态类型解析
- 關於richtextbox的問題!謝謝大家!
- DataGridTableStyle的问题【我要抓狂了,呜呜呜~~~救命啊】
- “System.Data.SqlClient.SqlCommand”并不包含CreateCommand对象,我现在急死了,完不成项目就去跳河去了,大家帮我啊!
- 未能加载文件或程序集“MyDbAdapters”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
- 向高手求教,c#与outlook的问题!!!
- 线程问题
- axWebBrowser事件不激发
- 微软的RDLC报表组件是否包含了数据填报功能?
foreach (string s in Enum.GetNames(t))
{
Console.WriteLine("值: 0x{0:X2} 名称: {1}", (int)Enum.Parse(t, s), s);
}
class Program
{
enum MultiHue { Black = 0, Red = 1, Green = 2, Blue = 4 }
static void Main(string[] args)
{
MultiHue Myenum = new MultiHue();
foreach (string enumItem in Enum.GetNames(Myenum.GetType()))
{
Console.WriteLine(enumItem);
}
Console.ReadKey();
}
}
这里怎么写代码遍历a,得到Black和Green 2个结果而不是遍历枚举的定义,谢谢各位,请看清问题
enum MultiHue{ Black = 0, Red = 1, Green = 2, Blue = 4}MultiHue a = MultiHue.Red | MultiHue.Green;
Console.WriteLine(a.ToString());这样直接就会有结果的,包含0的不好判断http://msdn.microsoft.com/zh-cn/library/cc138362.aspx
即 List<T> GetEnumList<T>(T t) where T:Enum 会编译出错
//根据枚举值组合,返回枚举明细项
public static List<int> GetEnumList(int enumInt)
{
if (enumInt <= 0)
return null; List<int> ret = new List<int>();
int clear = 1; // 用于屏蔽其它无效二进制位
while (clear <= enumInt)
{
int item = (enumInt & clear);
ret.Add(item); clear = clear << 1;
}
return ret;
}
另外,可以按位域组合的,第一项不能为0,比如:
M m =M.Green, 这时候它与 M m=M.Green|M.Black是一样的效果,二义性了
所以,我将楼主的枚举第一项改为1了判断代码如下:[Flags]
enum M { Black = 1, Red = 1, Green = 2, Blue = 4 }
class Program
{
static void Main(string[] args)
{
M m = M.Black | M.Red;
Type t = typeof(M);
string[] items = Enum.GetNames(t);
foreach (string s in items)
{
M n = (M)Enum.Parse(t, s);
if ((m & n) > 0)
{
Console.WriteLine("M has:" + s);
}
}
}
}
enum M { Black = 0001B, Red = 0010B, Green = 0100B, Blue = 1000B }
MultiHue[] GetFlags(MultiHue value)
{
return Enum.GetValues(typeof(MultiHue))
.OfType<MultiHue>()
.Where(t => (t & value) == t)
.ToArray();
}
http://www.cnblogs.com/kriss/archive/2005/02/04/101905.html
/// <summary>
/// 根据枚举值组合,返回枚举明细项
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static List<T> GetEnumList<T>(T obj) where T : struct
{
int objInt = Convert.ToInt32(obj);
Type type = typeof(T);
List<T> ret = new List<T>();
if (!type.IsEnum)
{
throw new ArgumentException("参数必须是枚举类型");
}
foreach (T t in Enum.GetValues(type))
{
int tmp = Convert.ToInt32(t);
if (tmp == 0)//枚举值为0,不处理
continue;
if ((tmp & objInt) == tmp)
{
ret.Add(t);
}
}
return ret;
}