2016-04-25 3 views
0

私はC#でコースリストを作成していますが、コースは実行中の日付を5つまで保持できます。理想的には、将来の今日の次の日が選択され、それに応じてリスト内で順序付けられます。C#null値を持つイベント日付を最後に注文する

私はこれまでに、次の日付を取得して表示するコースリストを作成しましたが、最初に日付なしのすべてのイベント(Null/Blank)が表示されます。私は、次の日のコースを最初に表示しようとしています。

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を試してみたが、右の注文を受けるように見えることはできません。どんな助けでも大歓迎です。

アンディ

+1

OrderTimeの前にSelectを使用して、DateTime.MinValueをnullに割り当てることができます。 (または合体) –

+1

'OrderBy(日付はnull).ThenBy(日付)'の行に沿って何かを試すこともできます – yaakov

+0

あなたの提案をお寄せいただきありがとうございます! – Andyram2k

答えて

1

あなたが投稿したコードは、仕分けに関するご質問には無関係と思われるいくつかの余分なものを持っています。私はそれを無視しています。手近な疑問に取り組んでいます。コースをどのように並べ替えることで、最も近い将来の日付が最初になるようにするのですか?

私は、次の将来の日付またはDateTime.MaxValueを "null"値として返す小さなメソッドを作成します。

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メンバーまたは拡張メソッドを作っ検討する必要があります。

関連する問題