Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
枚举列表C#_C# - Fatal编程技术网

枚举列表C#

枚举列表C#,c#,C#,我使用的api需要设置一周中的天数列表,这些天有一个枚举,但我不能使用列表。该参数预期类似于此RecurringDay.Monday | RecurringDay.周三 我似乎找不到一种方法来建立我的价值观,我为我的日子没有这样做的方式,似乎非常糟糕的编码。如何构建用户选择的日期列表,如RecurringDay.Monday | RecurringDay.周三| RecurringDay.Friday [Flags] public enum RecurringDay { Recurrin

我使用的api需要设置一周中的天数列表,这些天有一个枚举,但我不能使用列表。该参数预期类似于此RecurringDay.Monday | RecurringDay.周三

我似乎找不到一种方法来建立我的价值观,我为我的日子没有这样做的方式,似乎非常糟糕的编码。如何构建用户选择的日期列表,如RecurringDay.Monday | RecurringDay.周三| RecurringDay.Friday

[Flags]
public enum RecurringDay
{
    RecurringNone = 0,
    RecurringSunday = 1,
    RecurringSaturday = 2,
    RecurringWeekend = 3,
    RecurringFriday = 4,
    RecurringThursday = 8,
    RecurringWednesday = 16,
    RecurringTuesday = 32,
    RecurringMonday = 64,
    RecurringWeekdays = 124,
    RecurringAlldays = 127
}

schedule.LocalTime = new HueDateTime()
{
  DateTime = DateTime.Now.AddMinutes(1),
  RecurringDay = RecurringDay.RecurringMonday | RecurringDay.RecurringAlldays
};

标志枚举是位向量。每个枚举值对应于基础整数中的一位。设置位的组合表示值的组合。要使其工作,每个值都必须是2的幂,即设置了精确的on位。但是位的组合也可能有名称,如上例中的
RecurringWeekend

例如:

0b00010001 = 0x11 = 17
         1 Sunday included
        0  Saturday not included
       0   Friday not included
      0    Thursday not included
     1     Wednesday included
    0      Tuesday not included
   0       Monday not included
要建立这样的组合,只需使用|=运算符:

RecurringDay days = RecurringDay.RecurringNone;
if (user_selected_Sunday)
  days |= RecurringDay.RecurringSunday;
if (user_selected_Saturday)
  days |= RecurringDay.RecurringSaturday;
...
if (user_selected_Monday)
  days |= RecurringDay.RecurringMonday;
最后,
day
将包含与用户选择相匹配的适当天数组合


事实上,标志枚举值的每个实例都已经是一组值,当然也可能是空的,即
RecurringDay.RecurringNone
。无需在此处使用
列表。

我不确定您的问题是什么,但我觉得这个代码很好。首先,我去掉了你反复出现的“反复出现”,并使组合更加清晰(正如@Heretic Monkey所建议的):

然后我用不是类型名的属性名重新创建了HueDateTime类(为了清楚起见):

然后我使用了代码:

var schedule = new HueDateTime()
{
    When = DateTime.Now + TimeSpan.FromHours(1),
    HowOften = RecurringDay.Monday | RecurringDay.Wednesday
};

var succeeded = Enum.TryParse<RecurringDay>("Sunday,Monday,Tuesday", out var when);
var schedule=new HueDateTime()
{
When=DateTime.Now+TimeSpan.FromHours(1),
多久一次=复发日。星期一|复发日。星期三
};
var succeed=Enum.TryParse(“星期日、星期一、星期二”,out var when);
当最后一条语句完成执行时,
succeed
true
,当
键入值为
Sunday |星期二|星期一
时。我很确定这段代码很容易通过挑剔的代码审查员


我刚刚注意到,你的日子倒退了(星期天,星期六…星期二,星期一)-有什么特别的原因吗?这就是为什么
结束为
周日|周二|周一

我会设置
RecurringWeekend=RecurringSunday | RecurringSaturday
,同样设置
RecurringWeekdays
RecurringAllDays
,但这是我看到的唯一变化。您所指的“非常糟糕的编码”到底是什么?枚举只是类似于没有方法的类的结构。因此,请按structurename.day访问它。。如果从每个枚举值中删除重复出现的部分,则可以实现这一点。。对于列表,您可以使用列表;这里的问题是什么?我觉得你的代码很好,到底是什么问题?也许你可以用字典?但是您的代码更简洁,不管它值多少钱,Enum.Parse可能会有帮助(您的问题有点模糊)。在去掉所有的“循环”之后,您可以解析一个字符串,比如“周一、周二、周三”,您将得到一个正确类型的枚举,它表示这些标志设置的值。你需要调整以确保事情是正确的,但我发现这是多年来解决几个问题的方法。这很好,我不完全理解它的工作原理,但它不是破坏了enums提供的可读性。谢谢!这正是我所需要的。不知道他是个接线员
public class HueDateTime
{
    public DateTime When { get; set; }
    public RecurringDay HowOften { get; set; }
}
var schedule = new HueDateTime()
{
    When = DateTime.Now + TimeSpan.FromHours(1),
    HowOften = RecurringDay.Monday | RecurringDay.Wednesday
};

var succeeded = Enum.TryParse<RecurringDay>("Sunday,Monday,Tuesday", out var when);