void DeserializeConferenceFile(string xmlPath) { long start = DateTime.Now.Ticks; using (TextReader reader = new StreamReader(xmlPath)) { XmlSerializer serializer = new XmlSerializer(typeof(Conference2)); ConferenceData2 = (Conference2)serializer.Deserialize(reader); Console.WriteLine("[AppDelegate] deserialize2:" + new TimeSpan(DateTime.Now.Ticks - start).TotalMilliseconds); //http://stackoverflow.com/questions/617283/select-a-dictionaryt1-t2-with-linq // Version 2 'flat' data structure var sessDic2 = (from s2 in ConferenceData2.Sessions select s2).ToDictionary(item => item.Code); var speaDic2 = (from s3 in ConferenceData2.Speakers select s3).ToDictionary(item => item.Name); var tagDic2 = (from s3 in ConferenceData2.Tags select s3).ToDictionary(item => item.Value); // dictionaries to re-constitute version 1 data structure var speaDic1 = new Dictionary <string, ConfXml.Speaker>(); var sessDic1 = new Dictionary <string, ConfXml.Session2>(); var tagDic1 = new Dictionary <string, ConfXml.Tag>(); // create version 1 speakers foreach (var sp2 in speaDic2) { ConfXml.Speaker sp1 = sp2.Value as ConfXml.Speaker; speaDic1.Add(sp1.Name, sp1); } // create version 1 sessions // add sessions to version 1 tags // add sessions to version 1 speakers foreach (var se2 in sessDic2.Values) { ConfXml.Session2 se1 = se2 as ConfXml.Session2; sessDic1.Add(se1.Code, se1); foreach (var ta2 in se2.TagStrings) { if (!tagDic1.Keys.Contains(ta2)) { tagDic1.Add(ta2, new Tag { Value = ta2 }); } //Console.WriteLine("[AppDelegate] TAG " + ta2 + " ses " + se1.Code); tagDic1[ta2].Sessions.Add(se1); se1.Tags.Add(tagDic1[ta2]); } // add speakers to version 1 sessions foreach (var spn in se2.SpeakerNames) { //Console.WriteLine("[AppDelegate] SPKR " + se1.Code + " ses " + spn); if (speaDic1.ContainsKey(spn)) { //Aaron Skonnard se1.Speakers.Add(speaDic1[spn]); speaDic1[spn].Sessions.Add(se1); } } } // push into version 1 data structure, which rest of the app uses ConferenceData = new ConfXml.Conference(ConferenceData2); ConferenceData.Speakers = speaDic1.Values.ToList(); ConferenceData.Sessions = sessDic1.Values.ToList(); ConferenceData.Tags = tagDic1.Values.ToList(); ConfItem = ConferenceData2; // // ###### Load 'favorites' #### // var favPath = Path.Combine(Constants.DocumentsFolder, this.CurrentConferenceCode); favPath = Path.Combine(favPath, "Favorites.xml"); FavoriteSessions = new List <Session2>(); LoadWhatsOn(this.CurrentConferenceCode); this.IsDataLoaded = true; } Console.WriteLine("[AppDelegate] deserialize2+unpack:" + new TimeSpan(DateTime.Now.Ticks - start).TotalMilliseconds); }
public void UpdateFavorite(Session2 session, bool isFavorite) { var fs = (from s in this.FavoriteSessions where s.Code == session.Code select s).ToList(); if (fs.Count > 0) { // remove, as it might be old data persisted anyway (from previous conf.xml file) this.FavoriteSessions.Remove(fs[0]); } if (isFavorite) { // add it again this.FavoriteSessions.Add(new Session2(session.Clone())); } var temp = _FavoriteSessions.OrderBy(s => s.Start.Ticks); _FavoriteSessions = new List<Session2>(); foreach (var t in temp) { _FavoriteSessions.Add(t); } SaveFavouritesFile(); // This updates the 'whats on next' with favourites (if required) this.LoadWhatsOn(this.CurrentConferenceCode); }