如何将 DaysOfWeek 数组转换为枚举?

How to Convert DaysOfWeek Array to a Enum?

我正在使用 DaysOfTheWeek 从 EWS 获取 WeeklyPattern。它在数组中,可以是一天或多天。

我有一个名为 DayOfWeekMask 的枚举,我需要将数组转换为枚举。

当 Weeklypatter 包含 "Monday,Tuesday"

函数应该return:

return DayOfWeekMask.olMonday | DayOfWeekMask.olThursday ;

当每周模式包含 3 天时,它应该 return 3 个元素。

这可能吗?

假设您有一个格式化为以逗号分隔的天数列表的字符串:

"Monday, Tuesday, Thursday"

你可以Split把它变成一个字符串数组并解析每个元素:

var days = weekString.Split(',', StringSplitOptions.RemoveEmptyEntries);

DayOfWeekMask? result = null;

foreach (var day in days) {
    var enumDayName = "ol" + day;
    if (Enum.IsDefined(typeof(DayOfWeekMask), enumDayName)) {
        result |= (DayOfWeekMask)Enum.Parse(typeof(DayOfWeekMask), enumDayName, true);
    }
}

请注意,您需要为 DayOfWeekMask 的每个元素定义值,以使 ORing 正常工作!

如果您的输入是DayOfTheWeekCollection,那么您可以直接转换枚举值:

DayOfTheWeekCollection days;  // get this from somewhere

foreach (var day in days) {
    switch (day) {
        case DayOfTheWeek.Monday:
            result |= DayOfWeekMask.Monday;
            break;
        case DayOfTheWeek.Tuesday:
            // etc.
    }
}

我不知道您的变量的确切格式,但大致如下:

return (WeeklyPattern.Contains( "Monday") ? DayOfWeekMask.olMonday : 0)
  | (WeeklyPattern.Contains( "Tuesday") ? DayOfWeekMask.olTuesday : 0)
  | (WeeklyPattern.Contains( "Wednesday") ? DayOfWeekMask.olWednesday : 0)
  | (WeeklyPattern.Contains( "Thursday") ? DayOfWeekMask.olThursday : 0)
  | (WeeklyPattern.Contains( "Friday") ? DayOfWeekMask.olFriday : 0);

两个枚举中的名称非常相似(OlDaysOfWeek 只是将 "ol" 附加到名称的开头),因此我们可以利用这一点。

这会转换 DaysOfTheWeek property (a collection of DayOfTheWeek values) to OlDaysOfWeek (the type on the DayOfWeekMask 属性),这似乎是您所要求的:

OlDaysOfWeek daysOfTheWeek =
    weeklyPattern.DaysOfTheWeek
                 .Select(x => (OlDaysOfWeek) Enum.Parse(typeof (OlDaysOfWeek), "ol" + x))
                 .Aggregate((x, y) => x | y);

如果您的初始集合包括 DayOfTheWeek.TuesdayDayOfTheWeek.Thursday,这将输出一个等于 OlDaysOfWeek.olTuesday | OlDaysOfWeek.olThursday 的值。