当前位置: 首页 > 编程语言 > C#

在枚举值共享中查找最高设置标志

时间:2023-04-10 23:01:51 C#

在枚举值中查找最高设置标志我正在使用具有标志属性的枚举作为跟踪状态的方法。一个例子如下:Created=1Completed=2Dispatched=4没有写太多限制(如果选中,那么,如果选中,则执行此操作)我希望能够找到已设置的最高标志这个例子:ItemThe.Status=Status.Created|Status.Completed神秘方法将返回2-完成后,标志设置为具有最高值。GetMaxSetFlagValue(Item.Status)//返回2我发现问题围绕实际枚举而不是使用标志的值。我很确定这可以通过Linq实现......?像下面这样的东西应该工作:staticintGetMaxSetFlagValue(Tflags)whereT:struct{intvalue=(int)Convert.ChangeType(flags,typeof(int));IEnumerablesetValues=Enum.GetValues(flags.GetType()).Cast().Where(f=>(f&value)==f);返回setValues.Any()?setValues.Max():0;如果T不是枚举类型,此方法将失败,因此最好在方法开头执行检查。它也不适用于基础类型大于int(即long)的枚举。这是我使用的扩展方法。它会给你回复varmaxStatus=Item.Status.GetFlags().Max();输出:maxStatus=已完成publicstaticclassEnumExtensions{///在此集合中枚举获取标志。//////价值。/////////允许使用foreach处理此集合中的获取标志的枚举器。publicstaticIEnumerableGetFlags(thisTvalue)whereT:struct{returnGetFlags(value,Enum.GetValues(value.GetType()).Cast().ToArray());}///枚举此集合中的获取标志。//////价值。//////价值。/////////允许使用foreach处理此集合中的获取标志的枚举器。privatestaticIEnumerableGetFlags(Tvalue,T[]values)whereT:struct{if(!typeof(T).IsEnum){thrownewArgumentException("Typemustbeanenum.");}ulongbits=Convert.ToUInt64(value);varresults=new列表();对于(inti=values.Length-1;i>=0;i--){ulongmask=Convert.ToUInt64(values[i]);如果(i==0&&掩码==0L)b雷克;if((bits&mask)==mask){results.Add(values[i]);位-=掩码;}}if(bits!=0L)returnEnumerable.Empty();if(Convert.ToUInt64(value)!=0L)returnresults.Reverse();if(bits==Convert.ToUInt64(value)&&values.Length>0&&Convert.ToUInt64(values[0])==0L)returnvalues.Take(1);返回Enumerable.Empty();}}既然可以来回使用uint,那么可以使用:需要详细了解C#学习教程,希望大家多多关注—publicuintLowestBit(uintx){return~(x&x-1)&x;}publicuintHighestBit(uintx){uintlast=x;while(x!=0){last=x;x&=x-1;最后返回;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: