我有一些来自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; }
}
}
答案 0 :(得分: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
改进了答案答案 1 :(得分:0)
尝试这种方式:
var webinarsWithOrderedSessions = (from x in mappedWebinars
from y in x.TimeZones
from s in y.Session
orderby s.StartTime
select x).ToList();