按嵌套属性列出顺序
本文关键字:顺序 属性 嵌套 | 更新日期: 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();