1

I have some data coming back from a web service, which I have mapped to the following classes:

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; }
}

Hopefully it's fairly clear what is going on: any one webinar can have multiple time zones which in turn holds the individual sessions.

I have a list of webinars List<Webinar> webinars = ... which is populated with data. On the page I would like to present webinars grouped by time zone (easy) and then sorted by their start time.

My problem: the sessions are not necessarily ordered by StartTime when I receive the data, which I would like to do. I have the following code which does work, but recreating each object and mapping out all it's properties is a PITA, is there a nicer way to do what I want?

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

Building upon the suggestion by @Max, why might this bit of code not work? It doesn't seem to add the sessions at all. I don't necessarily need two properties, so I thought I'd just apply your suggestion directly to the main property.

public class TimeZone
{
    private List<Session> _sessions;

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

2 に答える 2

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

明示的な set と get を使用して回答を改善しました

于 2013-06-27T09:59:35.037 に答える
0

この方法を試してください:

var webinarsWithOrderedSessions = (from x in  mappedWebinars
                              from y in x.TimeZones
                              from s in y.Session 
                              orderby s.StartTime 
                              select x).ToList();
于 2013-06-27T09:31:32.693 に答える