我是C#枚举的新手。我将多个枚举值作为方法的参数传递。在我想知道的方法内部,我如何拥有价值。
让我解释一下。
Class A
{
[Flags]
public enum days
{
sunday =1,
monday =2,
tuesday= 4
}
static void Main(string[] args)
{
dummy(days.sunday|days.monday);
dummy(days.sunday);
}
public static void dummy(days Daysofweek)
{
if(\* Daysofweek is oly sunday*/){/*some function*/}
else if(\* Daysofweek is sunday and monday*/){/*some other function*/}
Console.WriteLine(Daysofweek.ToString());
}
}
'''
我要实现的是“如果参数中只有一个值,则执行某项操作,否则,执行其他操作”。
答案 0 :(得分:1)
我要实现的是“如果参数中只有一个值,则执行某项操作,否则,执行其他操作”。
由于Flags
是值的单个位,因此为2的幂,因此可以使用
uint v; // we want to see if v is a power of 2
bool f; // the result goes here
f = (v & (v - 1)) == 0;
检查该值是否为2的幂,如果不是,则设置多个标志。 看到这里:https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
但是请记住这一点
请注意,此处0被错误地视为2的幂。
public static void dummy(days Daysofweek)
{
int val = (int) Daysofweek;
bool hasMultipleFlagsSet = val != 0 && (val & (val - 1)) == 0;
if(hasMultipleFlagsSet){/*some function*/}
else {/*some other function*/}
Console.WriteLine(Daysofweek.ToString());
}
答案 1 :(得分:0)
使用HasFlag
scale_fill_manual(values = vals)
答案 2 :(得分:0)
先转换为整数,然后将设置为1的位数计数:
public enum DAYS
{
sunday =1,
monday =2,
tuesday= 4
}
static void Main(string[] args)
{
DAYS days = DAYS.sunday | DAYS.monday;
int numDays = CountDays(days);
}
static int CountDays(DAYS days)
{
int number = 0;
for(int i = 0; i < 32; i++)
{
number += ((uint)days & (1 << i)) == 0 ? 0 : 1;
}
return number;
}
答案 3 :(得分:0)
HasFlag是必经之路。这里是一个通用的解决方案:
public static int CountFlags( Enum days )
{
int flagsSet = 0;
foreach( var value in Enum.GetValues( days.GetType() ) )
{
if( days.HasFlag( (Enum)value ) )
{
++flagsSet;
}
}
return flagsSet;
}
答案 4 :(得分:0)
我要实现的是“如果参数中只有一个值 然后做某事,否则,如果有多个值,那就做一些 还有其他事情。”
假设您没有在枚举中添加任何“组合的”命名值(例如,您没有将Weekend
成员预设为Sunday|Saturday
),则可以使用{{3 }}
它将为枚举的命名成员返回一个非空字符串,对于多个组合的null
将返回一个非空字符串。