2013-06-27 2 views
1

У меня есть некоторые данные, поступающих назад от веба-сервиса, который я отображенный на следующие классы:Список OrderBy вложенного свойство

public class Webinar { 
    public string Title { get; set; } 
    public string Description { get; set; } 
    ... 
    public List<TimeZone> TimeZones { get; set; } 
} 

public class TimeZone { 
    public TimeSpan GmtOffset { get; set; } 
    public List<Session> Session { get; set; } 
} 

public class Session { 
    public int WebinarKey { get; set; } 
    public DateTime StartTime { get; set; } 
    public TimeSpan Duration { get; set; } 
} 

Надеется, это довольно ясно, что происходит: любой один вебинар может иметь несколько раз зон, которые, в свою очередь, проводят отдельные сеансы.

У меня есть список вебинаров List<Webinar> webinars = ..., который заполнен данными. На странице я хотел бы представить веб-семинары, сгруппированные по часовому поясу (легко), а затем отсортированные по времени их начала.

Моя проблема: сеансы не обязательно упорядочиваются StartTime, когда я получаю данные, которые я хотел бы сделать. У меня есть следующий код, который работает, но воссоздание каждого объекта и отображение всех его свойств - это PITA, есть ли лучший способ сделать то, что я хочу?

List<Webinar> webinarsWithOrderedSessions = new List<Webinar>(); 

foreach (Webinar webinar in mappedWebinars) 
{ 
    Webinar currentWebinar = new Webinar 
     { 
      Title = webinar.Title, 
      ... 
      TimeZones = new List<TimeZone>() 
     }; 

    foreach (Webinar.TimeZone timeZone in webinar.TimeZones) 
    { 
     Webinar.TimeZone currentTimeZone = new TimeZone 
      { 
       Location = timeZone.Location, 
       Sessions = new List<Session>() 
      }; 

     currentTimeZone.Sessions = timeZone.Sessions.OrderBy(session => session.StartTime).ToList(); 
     currentWebinar.TimeZones.Add(currentTimeZone); 
    } 

    webinarsWithOrderedSessions.Add(currentWebinar); 
} 

UPDATE

здания по предложению по @Max, почему может этот бит кода не работает? Кажется, он не добавляет сессий вообще. Мне не обязательно нужны два свойства, поэтому я подумал, что просто применил ваше предложение непосредственно к основному свойству.

public class TimeZone 
{ 
    private List<Session> _sessions; 

    public List<Session> Sessions 
    { 
     get { return _sessions.OrderBy(s => s.StartTime).ToList(); } 
     set { _sessions = value; } 
    } 
} 
+0

Почему вы скопировать объект просто для обновления порядка списка? Почему бы просто не использовать timezone.Sessions = timeZone.Sessions.OrderBy (session => session.StartTime) .ToList(); '? Хотя предложение Макса просто иметь свойство readonly для этого, вероятно, все равно лучше. – Chris

ответ

0

Попробуйте так:

var webinarsWithOrderedSessions = (from x in mappedWebinars 
           from y in x.TimeZones 
           from s in y.Session 
           orderby s.StartTime 
           select x).ToList(); 
+0

А, я действительно начал использовать этот метод, но потом понял, что это негруппированные вещи (если я не сделал это неправильно!). Таким образом, вместо двух вебинаров с двумя тайм-зонами каждая и каждая из двух сессий, у меня есть 8 вебинаров, в которых есть только одна вещь. Есть ли способ их перегруппировки? – Chris

2

Вы можете попробовать с этим:

public class TimeZone 
{ 
    private List<Session> _ordered; 

    public TimeSpan GmtOffset { get; set; } 
    public List<Session> Session 
    { 
     get 
     { 
      return this._ordered; 
     } 

     set 
     { 
      if (value != null) 
      { 
       this._ordered = value.OrderBy(p => p.StartTime);   
      } 
     } 
    } 
} 

Я улучшил ответ, используя явный набор и получить

+0

Должен сказать, мне очень нравится этот путь. О единственной проблеме, с которой я столкнулся (хотя я считаю, что это микро-оптимизация), я сначала запускаю эту процедуру, а затем кеширую данные. В то время как этот метод, чистый как есть, будет запускаться каждый раз, если я не ошибаюсь. – Chris

+0

Вы видели мое обновление о применении заказа непосредственно к свойству Session, а не к двум. Не самая большая проблема в мире Мне просто интересно узнать, почему это не работает. – Chris