public override IProfiler LoadProfilingSession(Guid sessionId) { var jsonArray = new JsonArrayObjects(); // parse json array of specified session for (var i = _logFileLines.Length - 1; i >= 0; --i) { var json = JsonObject.Parse(_logFileLines[i]); if (Guid.Parse(json["sessionId"]) == sessionId) { jsonArray.Add(json); } } // parse session var sessionJson = jsonArray.First(json => json["type"] == "session"); var session = ParseSessionFields(sessionJson); session.StepTimings = new List<SerializableStepTiming>(); session.CustomTimings = new List<SerializableCustomTiming>(); // parse step timings var stepJsons = jsonArray.Where(json => json["type"] == "step"); foreach (var stepJson in stepJsons) { var step = ParseStepFields(stepJson); session.StepTimings.Add(step); } // parse custom timings var customJsons = jsonArray.Where(json => json["type"] != "session" && json["type"] != "step"); foreach (var customJson in customJsons) { var custom = ParseCustomFields(customJson); session.CustomTimings.Add(custom); } // sort session step & custom timings SortSessionTimings(session); return session; }