2013-06-27 146 views
1

我有一些數據從一個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); 
} 

UPDATE經@Max建議

大廈爲什麼會這段代碼不行?它似乎沒有添加會話。我不一定需要兩個屬性,所以我認爲我只是將您的建議直接應用到主要屬性。

public class TimeZone 
{ 
    private List<Session> _sessions; 

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

你爲什麼要複製的對象只是爲了更新列表的順序?爲什麼不只是'timezone.Sessions = timeZone.Sessions.OrderBy(session => session.StartTime).ToList();'?儘管馬克斯的建議是隻要有隻讀屬性就可以做到,但反正可能更好。 – Chris

回答

0

試試這個方法:

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

啊,我實際上開始使用這種方法,但後來我意識到它是沒有組合的東西(除非我做錯了!)。所以我沒有兩個網絡研討會,每個網絡研討會都有兩個時區,每個網絡研討會有兩個會議,我只有8個網絡研討會,每個網絡研討會只有一個。有什麼方法可以重新組合它們嗎? – Chris

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

我已經用明確的一套完善的答案,並得到

+0

我必須說我很喜歡這種方式。關於我唯一遇到的問題(儘管我覺得這是微型優化)是我先運行這個程序,然後緩存數據。然而,如果我沒有弄錯,這個方法如果幹淨的話每次都會運行。 – Chris

+0

您是否看到有關將排序直接應用於Session屬性的更新,而不是有兩個。不是世界上最大的問題,我只是想知道爲什麼它不起作用。 – Chris