C# 列表orderby嵌套属性

C# 列表orderby嵌套属性,c#,asp.net,linq,C#,Asp.net,Linq,我有一些从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 GmtOf

我有一些从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; }
}
公共课网络研讨会{
公共字符串标题{get;set;}
公共字符串说明{get;set;}
...
公共列表时区{get;set;}
}
公共类时区{
公共时间跨度GmtOffset{get;set;}
公共列表会话{get;set;}
}
公开课{
public int WebinarKey{get;set;}
公共日期时间开始时间{get;set;}
公共时间跨度持续时间{get;set;}
}
希望情况相当清楚:任何一个网络研讨会都可以有多个时区,而这些时区又可以举行单独的会议

我有一个网络研讨会列表
list 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);
}
List webinarswithordedsessions=newlist();
foreach(mappedWebinars中的网络研讨会)
{
网络研讨会currentWebinar=新的网络研讨会
{
Title=网络研讨会。Title,
...
时区=新列表()
};
foreach(Webinar.TimeZone中的Webinar.TimeZone时区)
{
Webinar.TimeZone currentTimeZone=新时区
{
地点=时区。地点,
会话=新列表()
};
currentTimeZone.Sessions=timeZone.Sessions.OrderBy(session=>session.StartTime.ToList();
currentWebinar.TimeZones.Add(currentTimeZone);
}
添加(当前网络研讨会);
}
更新

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

public class TimeZone
{
    private List<Session> _sessions;

    public List<Session> Sessions
    {
        get { return _sessions.OrderBy(s => s.StartTime).ToList(); }
        set { _sessions = value; }
    }
}
公共类时区
{
私人名单会议;
公开名单会议
{
获取{return}sessions.OrderBy(s=>s.StartTime.ToList();}
设置{u sessions=value;}
}
}
尝试以下方法:

var webinarsWithOrderedSessions = (from x in  mappedWebinars
                              from y in x.TimeZones
                              from s in y.Session 
                              orderby s.StartTime 
                              select x).ToList();
您可以尝试以下方法:

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);         
            }
         }
    }
}
公共类时区
{
私人名单(已排序);;
公共时间跨度GmtOffset{get;set;}
公开名单会议
{ 
得到
{
退回这个;
}
设置
{
if(值!=null)
{
这个.u ordered=value.OrderBy(p=>p.StartTime);
}
}
}
}

我使用显式set和get改进了答案

为什么复制对象只是为了更新列表的顺序?为什么不直接执行
timezone.Sessions=timezone.Sessions.OrderBy(session=>session.StartTime.ToList()?尽管Max建议只使用一个只读属性来做这件事可能会更好。我必须说我非常喜欢这种方式。我唯一的问题是(尽管我觉得这是微观优化),我首先运行这个过程,然后缓存数据。然而,如果我没有弄错的话,这个方法虽然干净,但每次都会运行。您是否看到我关于将顺序直接应用于会话属性而不是两个的更新。这不是世界上最大的问题,我只是好奇为什么它不起作用。啊,我实际上开始使用这种方法,但后来我意识到这是非分组的事情(除非我做错了!)。因此,我没有两个网络研讨会,每个研讨会有两个时区,每个研讨会有两个会议,我有8个网络研讨会,每个研讨会只有一个。有什么方法可以重组他们吗?