簡體   English   中英

枚舉C#列表

[英]List of Enums C#

我正在使用需要在一周中設置幾天列表的api,這些天有一個枚舉,但是我不能使用列表。 該參數期望像這樣的RecurringDay.Monday | 循環日星期三

我似乎找不到一種方法,可以用我當日擁有的值來構建它,而不必以一種看起來非常糟糕的編碼方式進行。 如何構建用戶選擇的日期列表,如RecurringDay.Monday | RecurringDay.Wednesday | 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的冪,即正好設置了位。 但是位的組合也可能具有名稱,例如上例中的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 無需在此處使用List<>

我不確定您的問題是什么,但是這段代碼對我來說看起來不錯。 首先,我擺脫了您重復出現的“重復出現”,並使組合更清晰(如@Heretic Monkey建議):

[Flags]
public enum RecurringDay
{
    None = 0,
    Sunday = 1,
    Saturday = 2,
    Friday = 4,
    Thursday = 8,
    Wednesday = 16,
    Tuesday = 32,
    Monday = 64,
    Weekends = Saturday | Sunday,
    Weekdays = Monday | Tuesday | Wednesday | Thursday | Friday,
    Alldays = Weekdays | Weekends,
}

然后,我使用不是類型名稱的屬性名稱(為清楚起見)重新創建了HueDateTime類:

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);

當這最后語句執行完畢, succeededtruewhen的類型是RecurringDay具有的價值Sunday | Tuesday | Monday Sunday | Tuesday | Monday Sunday | Tuesday | Monday 我非常確定此代碼可以輕松地通過挑剔的代碼審閱者。

我剛剛注意到,您的日子倒退了(星期日,星期六,星期二,星期一)-出於某些原因? 這就是為什么when Sunday | Tuesday | Monday結束的原因Sunday | Tuesday | Monday Sunday | Tuesday | Monday Sunday | Tuesday | Monday

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM