C# 列表orderby嵌套属性
我有一些从web服务返回的数据,这些数据已映射到以下类: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
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个网络研讨会,每个研讨会只有一个。有什么方法可以重组他们吗?