C# 如何使我的IsItAHoliday功能更高效?

C# 如何使我的IsItAHoliday功能更高效?,c#,function,datetime,performance,C#,Function,Datetime,Performance,我有一个方法,如果是周末或其中一个假日,则应该返回1:元旦、阵亡将士纪念日、独立日、劳动节、感恩节和圣诞节,否则返回0。我选择了使用DateTime.DayOfYear和DateTime.IsLeapYear的组合来实现代码,但我觉得这样做效率很低,而且也使得像阵亡将士纪念日(5月的最后一个星期一!)这样的节日更加困难。我如何才能高效地实现我的目标,而不必硬编码每年都改变日期的假期 以下是我当前的实现: private int IsItAHoliday(DateTime time)

我有一个方法,如果是周末或其中一个假日,则应该返回1:元旦、阵亡将士纪念日、独立日、劳动节、感恩节和圣诞节,否则返回0。我选择了使用DateTime.DayOfYear和DateTime.IsLeapYear的组合来实现代码,但我觉得这样做效率很低,而且也使得像阵亡将士纪念日(5月的最后一个星期一!)这样的节日更加困难。我如何才能高效地实现我的目标,而不必硬编码每年都改变日期的假期

以下是我当前的实现:

    private int IsItAHoliday(DateTime time)
    {
        // Assume it is not a weekend
        int isWeekendOrHoliday = 0;

        // TODO: Memorial Day, Labor Day, Thanksgiving
        // Declare holidays
        int christmasDayNonLeapYearIndex = 359;
        int christmasDayLeapYearIndex = 360;
        int newYearsDayIndex = 1;
        int independenceDayNonLeapYearIndex = 185;
        int independenceDayLeapYearIndex = 186;

        // Find out if time falls on a weekend
        if (time.DayOfWeek == DayOfWeek.Saturday || time.DayOfWeek == DayOfWeek.Sunday)
        {
            isWeekendOrHoliday = 1;
        }
        // Find out if time falls on a holiday
        // Leap year
        if (DateTime.IsLeapYear(time.Year))
        {
            if ((time.DayOfYear == christmasDayLeapYearIndex) || (time.DayOfYear == independenceDayLeapYearIndex) || (time.DayOfYear == newYearsDayIndex))
            {
                isWeekendOrHoliday = 1;
            }
        }
        // Non-leap year
        else if (!DateTime.IsLeapYear(time.Year))
        {
            if ((time.DayOfYear == christmasDayNonLeapYearIndex) || (time.DayOfYear == independenceDayNonLeapYearIndex) || (time.DayOfYear == newYearsDayIndex))
            {
                isWeekendOrHoliday = 1;
            }
        }

        return isWeekendOrHoliday;
    }

如果要硬编码应用程序需要支持的每个事件,我建议您使用枚举,例如:

    public enum Holidays{
    newYearsDayIndex = 1,
    independenceDayNonLeapYearIndex = 185,
        independenceDayLeapYearIndex = 186,
    christmasDayNonLeapYearIndex = 359,
        christmasDayLeapYearIndex = 360
    }
然后使用每个的值作为假日的日期索引和名称来解释为什么这一天是假日

    Enum.GetValues(typeof(Holidays)); --> For values which you will use as days Index
    Enum.GetNames(typeof(Holidays)); --> For Names which you will use to describe the picked date

你也可以考虑在你的命名约定

< p>单独的枚举中分离闰月和非闰假日。我建议你使用枚举,如果你要硬编码你需要应用程序支持的每一个事件,例如:

    public enum Holidays{
    newYearsDayIndex = 1,
    independenceDayNonLeapYearIndex = 185,
        independenceDayLeapYearIndex = 186,
    christmasDayNonLeapYearIndex = 359,
        christmasDayLeapYearIndex = 360
    }
然后使用每个的值作为假日的日期索引和名称来解释为什么这一天是假日

    Enum.GetValues(typeof(Holidays)); --> For values which you will use as days Index
    Enum.GetNames(typeof(Holidays)); --> For Names which you will use to describe the picked date

你也可以考虑在你的命名约定

< p>单独的枚举中分离闰月和非闰假日。我建议你使用枚举,如果你要硬编码你需要应用程序支持的每一个事件,例如:

    public enum Holidays{
    newYearsDayIndex = 1,
    independenceDayNonLeapYearIndex = 185,
        independenceDayLeapYearIndex = 186,
    christmasDayNonLeapYearIndex = 359,
        christmasDayLeapYearIndex = 360
    }
然后使用每个的值作为假日的日期索引和名称来解释为什么这一天是假日

    Enum.GetValues(typeof(Holidays)); --> For values which you will use as days Index
    Enum.GetNames(typeof(Holidays)); --> For Names which you will use to describe the picked date

你也可以考虑在你的命名约定

< p>单独的枚举中分离闰月和非闰假日。我建议你使用枚举,如果你要硬编码你需要应用程序支持的每一个事件,例如:

    public enum Holidays{
    newYearsDayIndex = 1,
    independenceDayNonLeapYearIndex = 185,
        independenceDayLeapYearIndex = 186,
    christmasDayNonLeapYearIndex = 359,
        christmasDayLeapYearIndex = 360
    }
然后使用每个的值作为假日的日期索引和名称来解释为什么这一天是假日

    Enum.GetValues(typeof(Holidays)); --> For values which you will use as days Index
    Enum.GetNames(typeof(Holidays)); --> For Names which you will use to describe the picked date

你也可以考虑在你的命名约定

< P>中单独地划分闰月和非闰假日,你不需要在假期中检查<代码>年份<代码>,因为它们每年出现在同一日期,比如说12月25日、1月等。 我很快编译了一些代码:

public class Holiday
{
    public int Day {get; private set;}
    public int Month {get; private set;}
    public Holiday(int day, int month)
    {
        this.Day = day;
        this.Month = month;
    }

    public bool IsEqual(DateTime dateTime)
    {
        return ((this.Day == dateTime.Day) && (this.Month == dateTime.Month));
    }
}

public static class DateTimeExtensions
{
    private static List<Holiday> holidays = new List<Holiday>();

    public static void RegisterHoliday(Holiday holiday)
    {
        holidays.Add(holiday);
    }

    public static bool IsHoliday(this DateTime dateTime)
    {
        foreach (Holiday holiday in holidays)
        {
            if (holiday.IsEqual(dateTime)) return true;
        }
        return false;
    }

    public static bool IsWeekend(this DateTime dateTime)
    {
        return (dateTime.DayOfWeek == DayOfWeek.Sunday) || (dateTime.DayOfWeek == DayOfWeek.Saturday);
    }
}
公共假期
{
公共整数日{get;私有集;}
public int Month{get;private set;}
公众假期(国际日、国际月)
{
这个.天=天;
本月=月;
}
公共布尔IsEqual(日期时间日期时间)
{
返回((this.Day==dateTime.Day)&&(this.Month==dateTime.Month));
}
}
公共静态类DateTimeExtensions
{
私有静态列表假日=新列表();
公众假期
{
假日。添加(假日);
}
公共静态bool IsHoliday(此日期时间日期时间)
{
foreach(假日中的假日)
{
if(holiday.IsEqual(dateTime))返回true;
}
返回false;
}
公共静态bool IsWeekend(此日期时间日期时间)
{
return(dateTime.DayOfWeek==DayOfWeek.Sunday)| |(dateTime.DayOfWeek==DayOfWeek.周六);
}
}
现在使用
Register
方法添加假日,并使用扩展名。
DateTimeExtensions.RegisterHoliday(新假日(25,12))

DateTime dateTimeToCheck=newdatetime(2013,12,25)

return dateTimeToCheck.IsHoliday()|| dateTimeToCheck.IsWeekend()

您不需要在节假日检查
年份,因为它们出现在每年相同的日期,例如12月25日、1月1日等

我很快编译了一些代码:

public class Holiday
{
    public int Day {get; private set;}
    public int Month {get; private set;}
    public Holiday(int day, int month)
    {
        this.Day = day;
        this.Month = month;
    }

    public bool IsEqual(DateTime dateTime)
    {
        return ((this.Day == dateTime.Day) && (this.Month == dateTime.Month));
    }
}

public static class DateTimeExtensions
{
    private static List<Holiday> holidays = new List<Holiday>();

    public static void RegisterHoliday(Holiday holiday)
    {
        holidays.Add(holiday);
    }

    public static bool IsHoliday(this DateTime dateTime)
    {
        foreach (Holiday holiday in holidays)
        {
            if (holiday.IsEqual(dateTime)) return true;
        }
        return false;
    }

    public static bool IsWeekend(this DateTime dateTime)
    {
        return (dateTime.DayOfWeek == DayOfWeek.Sunday) || (dateTime.DayOfWeek == DayOfWeek.Saturday);
    }
}
公共假期
{
公共整数日{get;私有集;}
public int Month{get;private set;}
公众假期(国际日、国际月)
{
这个.天=天;
本月=月;
}
公共布尔IsEqual(日期时间日期时间)
{
返回((this.Day==dateTime.Day)&&(this.Month==dateTime.Month));
}
}
公共静态类DateTimeExtensions
{
私有静态列表假日=新列表();
公众假期
{
假日。添加(假日);
}
公共静态bool IsHoliday(此日期时间日期时间)
{
foreach(假日中的假日)
{
if(holiday.IsEqual(dateTime))返回true;
}
返回false;
}
公共静态bool IsWeekend(此日期时间日期时间)
{
return(dateTime.DayOfWeek==DayOfWeek.Sunday)| |(dateTime.DayOfWeek==DayOfWeek.周六);
}
}
现在使用
Register
方法添加假日,并使用扩展名。
DateTimeExtensions.RegisterHoliday(新假日(25,12))

DateTime dateTimeToCheck=newdatetime(2013,12,25)

return dateTimeToCheck.IsHoliday()|| dateTimeToCheck.IsWeekend()

您不需要在节假日检查
年份,因为它们出现在每年相同的日期,例如12月25日、1月1日等

我很快编译了一些代码:

public class Holiday
{
    public int Day {get; private set;}
    public int Month {get; private set;}
    public Holiday(int day, int month)
    {
        this.Day = day;
        this.Month = month;
    }

    public bool IsEqual(DateTime dateTime)
    {
        return ((this.Day == dateTime.Day) && (this.Month == dateTime.Month));
    }
}

public static class DateTimeExtensions
{
    private static List<Holiday> holidays = new List<Holiday>();

    public static void RegisterHoliday(Holiday holiday)
    {
        holidays.Add(holiday);
    }

    public static bool IsHoliday(this DateTime dateTime)
    {
        foreach (Holiday holiday in holidays)
        {
            if (holiday.IsEqual(dateTime)) return true;
        }
        return false;
    }

    public static bool IsWeekend(this DateTime dateTime)
    {
        return (dateTime.DayOfWeek == DayOfWeek.Sunday) || (dateTime.DayOfWeek == DayOfWeek.Saturday);
    }
}
公共假期
{
公共整数日{get;私有集;}
public int Month{get;private set;}
公众假期(国际日、国际月)
{
这个.天=天;
本月=月;
}
公共布尔IsEqual(日期时间日期时间)
{
返回((this.Day==dateTime.Day)&&(this.Month==dateTime.Month));
}
}
公共静态类DateTimeExtensions
{
私有静态列表假日=新列表();
公众假期
{
假日。添加(假日);
}
公共静态bool IsHoliday(此日期时间日期时间)
{
foreach(假日中的假日)
{
if(holiday.IsEqual(dateTime))返回true;
}
返回false;
}
公共静态bool IsWeekend(此日期时间日期时间)