按嵌套属性列出顺序

本文关键字:顺序 属性 嵌套 | 更新日期: 2023-09-27 18:20:02

我有一些来自web服务的数据,我已经将其映射到以下类:

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

更新

基于@Max的建议,为什么这部分代码可能不起作用?它似乎根本没有添加会话。我不一定需要两个属性,所以我想我应该直接将你的建议应用于主属性。

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

按嵌套属性列出顺序

您可以尝试以下操作:

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

我使用显式集改进了答案,并获得了

试试这个方法:

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