如何使用linq或contains从包含日期和名称的哈希集中检索日期?

时间:2016-12-29 21:22:07

标签: c# linq asp.net-web-api contains hashset

我是Web API的新手,需要有关代码的帮助。

如果通过的日期是boolean中列出的假日,或者是星期六或星期日,我想要返回GetHolidays

这是我的功能,我想检查特定日期是否是假日。

public bool IsHoliday(DateTime requesteddate)
{
    HashSet<Holidays> holidays = new HashSet<Holidays>();
    string sat = requesteddate.DayOfWeek.ToString();
    string sun = requesteddate.DayOfWeek.ToString();

    holidays = GetHolidays(requesteddate.Year);
    return true;
}

这是我整年计算的假期的散列集,并且完美无缺

public HashSet<Holidays> GetHolidays(int year)
{
    HashSet<Holidays> holidays = new HashSet<Holidays>();

    // NEW YEARS 
    DateTime newYearsDate = AdjustForWeekendHoliday(new DateTime(year, 1, 1).Date);
    holidays.Add(new Holidays(newYearsDate, "New Years Day"));

    // MARTIN LUTHER KING, JR. DAY -- third Monday of January
    DateTime martinLutherDay = new DateTime(year, 1, (from day in Enumerable.Range(1, 31) where new DateTime(year, 1, day).DayOfWeek == DayOfWeek.Monday select day).ElementAt(2));
    holidays.Add(new Holidays(martinLutherDay, "Martin Luther King, Jr. Day"));

    // PRESIDENT'S DAY -- third Monday of February
    DateTime presidentsDay = new DateTime(year, 2, (from day in Enumerable.Range(1, 29) where new DateTime(year, 2, day).DayOfWeek == DayOfWeek.Monday select day).ElementAt(2));
    holidays.Add(new Holidays(presidentsDay, "President's Day"));

    // MEMORIAL DAY  -- last monday in May 
    DateTime memorialDay = new DateTime(year, 5, 31);
    DayOfWeek dayOfWeek = memorialDay.DayOfWeek;

    while (dayOfWeek != DayOfWeek.Monday)
    {
        memorialDay = memorialDay.AddDays(-1);
        dayOfWeek = memorialDay.DayOfWeek;
    }

    holidays.Add(new Holidays(memorialDay.Date, "Memorial Day"));

    // INDEPENCENCE DAY 
    DateTime independenceDay = AdjustForWeekendHoliday(new DateTime(year, 7, 4).Date);
    holidays.Add(new Holidays(independenceDay, "Independence Day"));

    // LABOR DAY -- 1st Monday in September 
    DateTime laborDay = new DateTime(year, 9, 1);
    dayOfWeek = laborDay.DayOfWeek;

    while (dayOfWeek != DayOfWeek.Monday)
    {
        laborDay = laborDay.AddDays(1);
        dayOfWeek = laborDay.DayOfWeek;
    }

    holidays.Add(new Holidays(laborDay.Date, "Labor Day"));

    // VETERANS DAY 
    DateTime veteransDay = AdjustForWeekendHoliday(new DateTime(year, 11, 11).Date);
    holidays.Add(new Holidays(veteransDay, "Veterans Day"));

    // THANKSGIVING DAY - 4th Thursday in November 
    var thanksgiving = (from day in Enumerable.Range(1, 30) where new DateTime(year, 11, day).DayOfWeek == `DayOfWeek.Thursday select day).ElementAt(3);
    DateTime thanksgivingDay = new DateTime(year, 11, thanksgiving);
    holidays.Add(new Holidays(thanksgivingDay.Date, "Thanksgiving"));

    // DAY AFTER THANKSGIVING DAY 
    DateTime dayAfterThankGiving = thanksgivingDay.AddDays(1);
    holidays.Add(new Holidays(dayAfterThankGiving, "Day after Thanksgiving"));

    // CHRISTMAS
    DateTime christmasDay = AdjustForWeekendHoliday(new DateTime(year, 12, 25).Date, true);
    holidays.Add(new Holidays(christmasDay, "Christmas"));

    // CHRISTMAS EVE 
    DateTime christmasEve = christmasDay.AddDays(-1);
    holidays.Add(new Holidays(christmasEve, "Christmas"));

    return holidays;
}

以下是控制器中的IHTTP操作

[HttpGet]
public IHttpActionResult IsHoliday(DateTime requesteddate)
{
    try
    {
        var isHoliday = _dateService.IsHoliday(requesteddate);
        return Content(HttpStatusCode.OK, isHoliday);
    }
    catch (Exception exception)
    {
        return BadRequest(exception.Message);
    }
}

2 个答案:

答案 0 :(得分:1)

如果Holidays类实现GetHashCodeEquals只是比较类的日期部分而不仅仅是检查Contains将起作用:

var isHoliday = holidays.Contains(new Holidays(requesteddate, "fake"));

如果Holidays类没有实现GetHashCodeEquals对(修复代码 - Why is it important to override GetHashCode when Equals method is overridden?),或者该类实际上比较了这两种方法中的所有字段而不是需要迭代所有项目并手动比较日期:

var isHoliday = holidays.Contains(h => h.Date == requesteddate);

我个人会使用Dictionary<DateTime, Holiday>代替HashSet,因为通过ContainsKey按日期查找会更明显日期是否在集合中。

旁注:Holidays是单个项目的非常奇怪的名称 - 通常是复数名词暗示集合。

答案 1 :(得分:0)

最后我这样做了......但是感谢您的帮助

linked_node<int> ptr = numbers.head;
cout << ptr->data << " ";
ptr = ptr->next;
cout << ptr->data << " ";
ptr = ptr->next;
cout << ptr->data << " ";
ptr = ptr->next;