计算Enum参数的数量

时间:2019-08-22 09:38:26

标签: c# enums

我是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());

        }
}

'''

我要实现的是“如果参数中只有一个值,则执行某项操作,否则,执行其他操作”。

5 个答案:

答案 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将返回一个非空字符串。