2016-04-25 53 views
0

我正在C#課程清單工作,並且一個課程最多可以有5個日期時間運行。理想情況下,選擇今天之後的下一個日期,並相應地列入清單。C#排序事件日期的空值爲最後

我到目前爲止是一個課程列表,它獲取下一個日期並顯示它,但它首先顯示所有沒有日期的事件(空/空)。我試圖首先顯示下一個日期的課程,然後是那些之後沒有的課程。

C#代碼:

public ActionResult FilterList(string role = null, string category = null) 
    { 
     return View("~/Views/FilterList.cshtml", GetCourses(role, category)); 
    } 

    [NonAction] 
    public List<IEnumerable<Course>> GetCourses(string role = null, string category = null) 
    { 
     var collection = new List<IEnumerable<Course>>(); 
     var items = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CourseRoot) 
      .Children.Where(m => m.TemplateID == Course.TemplateID) 
      .Select(m => (Course)m).ToList(); 

     var dates = new List<FilterDates>(); 
     items.ForEach(m => dates.Add(new FilterDates 
     { 
      Dates = new List<DateTime>{ m.Date1, m.Date2, m.Date3, m.Date4, m.Date5 }, 
      Name = m.Name 
     })); 

     dates.ForEach(m => m.Dates.RemoveAll(n => n == new DateTime(0001, 01, 01))); 
     dates.ForEach(m => m.Dates.Sort((a, b) => a.CompareTo(b))); 
     dates = dates.OrderBy(m => m.Dates.AsQueryable().FirstOrDefault(n => n - DateTime.Now >= TimeSpan.Zero)).ToList(); 
     var model = new List<Course>(); 
     dates.ForEach(m => model.Add(items.AsQueryable().FirstOrDefault(n => n.Name == m.Name))); 

     if (!string.IsNullOrEmpty(role) || !string.IsNullOrEmpty(category)) 
     { 
      var currentRole = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CategoryRoot) 
       .Children.AsQueryable().FirstOrDefault(m => m.Fields["Key"].Value == role); 

      if (!string.IsNullOrEmpty(category)) 
      { 
       var currentCategory = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.SeriesRoot) 
       .Children.AsQueryable().FirstOrDefault(m => m.Fields["Key"].Value == category); 

       model = model.Where(m => m.Series == currentCategory.Name).ToList(); 

       if (string.IsNullOrEmpty(role)) 
       { 
        collection.Add(model); 
       } 
      } 

      if (!string.IsNullOrEmpty(role)) 
      { 
       model = model.Where(m => m.InnerItem.Children.Where(n => n.Fields["Key"].Value == currentRole.Name).Any()).ToList(); 
       List<Course> required = new List<Course>(), recommended = new List<Course>(), refresh = new List<Course>(); 

       foreach (var item in model) 
       { 
        foreach (Item inner in item.InnerItem.Children) 
        { 
         if (inner.Fields["Key"].Value == currentRole.Name) 
         { 
          switch (inner.Fields["Severity"].Value) 
          { 
           case "Required": 
            required.Add(item); 
            break; 
           case "Recommended": 
            recommended.Add(item); 
            break; 
           case "Refresh": 
            refresh.Add(item); 
            break; 
          } 
         } 
        } 
       } 

       collection.Add(required); 
       collection.Add(recommended); 
       collection.Add(refresh); 
      } 
     } 
     else 
     { 
      collection.Add(model); 
     } 
     return collection; 
    } 

我已經嘗試了不同的orderbys,但似乎無法得到排序的權利。任何幫助將不勝感激。

Andy

+1

您可以在orderby之前使用Select將DateTime.MinValue分配給空字符。 (或合併) –

+1

你也可以嘗試'OrderBy(日期爲空)的行。ThenBy(date)' – yaakov

+0

謝謝你的建議! – Andyram2k

回答

1

您發佈的代碼有一些額外的東西,似乎與您的排序問題無關。我忽略了這個問題,只是解決了手頭的問題:如何對您的課程進行排序,以便將最接近未來日期的課程排在第一位。

我會創建一個小方法來返回下一個未來日期或DateTime.MaxValue作爲「空」值。

private DateTime GetNextFutureDate(Course course) 
{ 
    var dates = 
     new[] {course.Date1, course.Date2, course.Date3, course.Date4, course.Date5}.Where(d => d > DateTime.Now).ToArray(); 
    return dates.Length == 0 ? DateTime.MaxValue : dates[0]; 
} 

然後在您的GetCourses方法,你可以使用這樣的:

[NonAction] 
public List<IEnumerable<Course>> GetCourses(string role = null, string category = null) 
{ 
    var collection = new List<IEnumerable<Course>>(); 
    var model = Sitecore.Context.Database.GetItem(SitecoreIDs.Pages.CourseRoot) 
     .Children.Where(m => m.TemplateID == Course.TemplateID) 
     .Select(m => (Course)m).OrderBy(m => GetNextFutureDate(m)); 

    if (!string.IsNullOrEmpty(role) || !string.IsNullOrEmpty(category)) 
    // ... the rest of your code ... 

    return collection; 
} 

您也可能要考慮你的課程班製作GetNextFutureDate成員或擴展方法。