簡體   English   中英

如何使用 C# 通過枚舉列表檢查值

[英]How to check value with Enum Listing using C#

我正在開發一個已實現功能的應用程序。 流程就像我們正在獲取可以是1 HOURS2 HOURS1 WEEK2 WEEKS1 MONTH的設置。 例如,如果我從數據庫中獲取設置,例如 1 HOUR,那么它將計算兩個日期之間的差異,並檢查1 HOUR與我從計算中獲得的差異。 我已經通過使用多個IF檢查來完成它,但我想優化代碼。 這是我的實現。

public enum TaskSchedulingEnum : int
    {
        [Description("1 HOUR")]
        OneHour = 1,
        [Description("2 HOURS")]
        TwoHours = 2,
        [Description("8 HOURS")]
        EightHours = 8,
        [Description("1 DAY")]
        OneDay = 1,
        [Description("3 DAYS")]
        ThreeDays = 3,
        [Description("1 WEEK")]
        OneWeek = 1,
        [Description("2 WEEKS")]
        TwoWeeks = 2,
        [Description("1 MONTH")]
        OneMonth = 1,
        [Description("ALWAYS")]
        Always = 14
    }

private async Task<bool> GetUserSettings(string companyId, DateTime? TaskStartDateTime)
        {


            // get company settings ... 
            var settings = await projulSettingsService.GetCompanyNotificationSettings(companyId, ProjulSettingsTypeEnum.Notifications);
            var scheduleSettings = string.Empty;
            if (settings.Where(x => x.Name == ProjulPortalSettings.GeneralSettingsNotificationIsDisabled).Select(x => x.Value).FirstOrDefault() == "false")
            {
                scheduleSettings = JsonConvert.DeserializeObject<string>(settings.Where(x => x.Name == ProjulPortalSettings.NotificationTaskAssignedImmediateWindow).Select(x => x.Value).FirstOrDefault());
                if (!string.IsNullOrEmpty(scheduleSettings))
                {
                    var _timespan = (DateTime.UtcNow - TaskStartDateTime).Value;
                    var difference = _timespan.TotalHours; // in hours..
                    TimeSpan days = TimeSpan.FromHours(difference); // days..
                    var weeks = (days.TotalDays % 365) / 7; // weeks 
                    var months = (days.TotalDays % 365) / 30; // months

                    var list = ApplicationExtensions.GetEnumList<TaskSchedulingEnum>().ToList();
                    var _val = list.Where(x => x.Text == scheduleSettings).FirstOrDefault();

                    if (scheduleSettings == TaskSchedulingEnum.OneHour.GetEnumDescrip()
                        || scheduleSettings == TaskSchedulingEnum.TwoHours.GetEnumDescrip()
                        || scheduleSettings == TaskSchedulingEnum.EightHours.GetEnumDescrip())
                    {
                        if (difference == Convert.ToDouble(_val.Value))
                            return true;
                    }
                    else if (scheduleSettings == TaskSchedulingEnum.OneDay.GetEnumDescrip()
                         || scheduleSettings == TaskSchedulingEnum.ThreeDays.GetEnumDescrip())
                    {
                        if (days.TotalDays == Convert.ToDouble(_val.Value))
                            return true;
                    }
                    else if (scheduleSettings == TaskSchedulingEnum.OneWeek.GetEnumDescrip()
                        || scheduleSettings == TaskSchedulingEnum.TwoWeeks.GetEnumDescrip())
                    {
                        if (weeks == Convert.ToDouble(_val.Value))
                            return true;
                    }
                    else if (scheduleSettings == TaskSchedulingEnum.OneMonth.GetEnumDescrip())
                    {
                        if (months == Convert.ToDouble(_val.Value))
                            return true;
                    }
                    else if (scheduleSettings == TaskSchedulingEnum.Always.GetEnumDescrip())
                    {
                        return true;
                    }
                    return false;

                }
            }
            return false;
        }

有沒有辦法編寫優化和更少的代碼來實現功能? 我從數據庫中獲得了與枚舉描述中提到的相同的設置。 每次都可以是一個值。 始終檢查將始終返回 true。

我不建議以這種方式使用枚舉值。 讓每個枚舉值代表一個任意標簽,您可以使用擴展方法單獨將其轉換為持續時間。 例如:

        public static TimeSpan ToDuration(this TaskSchedulingEnum self)
        {
            return self switch
            {
                TaskSchedulingEnum.OneHour => TimeSpan.FromHours(1),
                TaskSchedulingEnum.TwoHours => TimeSpan.FromHours(2),
                TaskSchedulingEnum.OneDay => TimeSpan.FromDays(1),
                TaskSchedulingEnum.Always => Timeout.InfiniteTimeSpan,
            };
        }

一旦你有一個時間跨度來描述持續時間,將它添加到任何開始時間以獲得結束時間或其他類似操作應該是微不足道的。

請注意,您可能需要對Always值進行特殊處理,因為具有無窮大的算術運算將無法正常工作。 您可能想用TimeSpan.MaxValue來描述它或使用TimeSpan? 而是鍵入,具體取決於它的使用方式。

暫無
暫無

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

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