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