2016-12-29 34 views
1

我是Web API的新手,需要代碼方面的幫助。如何從包含使用linq或包含日期和名稱的哈希集檢索日期?

我想回到一個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; 
} 

這是我算過了整整一年的假期HashSet的和完美的作品

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); 
    } 
} 
+1

注意,'Holidays'應覆蓋'GetHashCode'和'Equals'方法。 –

回答

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是單項非常奇怪的名稱 - 通常複數名詞意味着收藏。

+0

爲什麼混合_不好的答案與良好的答案? :當計算對象的哈希值時,它真的很奇怪,不考慮對象屬性的一部分。特別是當對象需要該屬性時(即不是可選的)...使用Dictionary絕對是答案。 –

+0

感謝您的回覆。 我嘗試過手動比較購買,但是,不管我放置返回的日期是否爲假。 – user1746021

+0

@ user1746021很可能是因爲你在命名變量時欺騙了你自己 - 很可能'requesteddate'不是日期,而是當前時間或類似的東西。這就是爲什麼提供[MCVE]是良好SO問題的重要組成部分。 –

0

最後我得到了它這樣....但感謝幫助

public bool IsHoliday(DateTime requesteddate, HolidayType type) 
{ 
    var holidays = GetHolidays(requesteddate.Year, type); 
    return holidays.Any(h => DateTime.Equals(h.Date, requesteddate)); 
} 
+0

因此,您使用的是哈希集,但是通過循環遍歷每個項目以找到具有匹配屬性的項目?爲什麼不像剛剛提到的那樣重寫'Equals'和'GetHashCode'呢? –