private void ParseMarket()
        {
            // Get all market definition changes
            var mktDetails = JsonObjects.Where(j => j.mc.Any(m => m.marketDefinition != null)).OrderBy(j => j.pt).ToList();

            // Need to get accurate timestamps and reduction factors for when a non-runner was removed from a market
            // First grab all non-runner info, which will include duplicates
            var nonRunnersList = new List <KeyValuePair <long, Tuple <long, double> > >();

            foreach (var j in mktDetails)
            {
                foreach (var m in j.mc)
                {
                    foreach (var r in m.marketDefinition.runners)
                    {
                        if (r.removalDate > DateTime.MinValue)
                        {
                            nonRunnersList.Add(new KeyValuePair <long, Tuple <long, double> >(r.id, new Tuple <long, double>(j.pt, r.adjustmentFactor)));
                        }
                    }
                }
            }

            // Then convert to a dictionary with one entry per non-runner
            NonRunnerRemovalInfo = nonRunnersList
                                   .GroupBy(kvp => kvp.Key)
                                   .Select(grp => new { g = grp.OrderBy(x => x.Value.Item1).FirstOrDefault() })
                                   .ToDictionary(
                k => k.g.Key,
                v => new Tuple <DateTime, double>(
                    DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(Math.Round(v.g.Value.Item1 / 1000.0, 0))).UtcDateTime,
                    v.g.Value.Item2 / 100.0
                    ));


            // All other details we can get from the last market definition at the off
            var mktDetail = mktDetails.Last();

            // Timestamp
            var offTime = DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64(Math.Round(mktDetail.pt / 1000.0, 0))).UtcDateTime;

            // Extract the market definition details
            var mc = mktDetail.mc.Where(m => m.marketDefinition != null).First();

            // Market id
            var id = Convert.ToInt64(mc.id.Split('.')[1]);

            // Extract other details
            var mktDef                = mc.marketDefinition;
            var eventId               = Convert.ToInt64(mktDef.eventId);
            var countryCode           = mktDef.countryCode;
            var venue                 = mktDef.venue;
            var marketTime            = mktDef.marketTime;
            var marketName            = mktDef.name;
            var numberOfActiveRunners = mktDef.numberOfActiveRunners;
            var status                = mktDef.status;
            var runners               = mktDef.runners;
            var numRunners            = runners.Count;

            // Create a class for each selection
            foreach (var runner in runners)
            {
                var exchMktSel = new ExchangeMarketSelection()
                {
                    EventId       = eventId,
                    MarketId      = id,
                    MeetingDate   = marketTime.Date,
                    DayOfWeek     = marketTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)marketTime.DayOfWeek,
                    CountryCode   = countryCode,
                    Track         = venue,
                    RaceTime      = marketTime,
                    OffTime       = offTime,
                    MarketName    = marketName,
                    Entries       = numRunners,
                    Runners       = numberOfActiveRunners,
                    SelectionId   = runner.id,
                    SelectionName = runner.name,
                    Bsp           = runner.bsp
                };

                // Check if a non-runner
                if (runner.status == "REMOVED")
                {
                    exchMktSel.NonRunner       = true;
                    exchMktSel.RemovalTime     = NonRunnerRemovalInfo[runner.id].Item1;
                    exchMktSel.ReductionFactor = NonRunnerRemovalInfo[runner.id].Item2;
                }

                ExchangeSelections.Add(exchMktSel);
            }
        }
 public IEnumerable <long> GetSelectionIds()
 {
     return(ExchangeSelections.Select(e => e.SelectionId).OrderBy(s => s));
 }
 public Dictionary <long, string> GetSelectionIdsAndNames()
 {
     return(ExchangeSelections.OrderBy(e => e.SelectionId).ToDictionary(k => k.SelectionId, v => v.SelectionName));
 }
 public IEnumerable <string> GetCleanDataForCSV()
 {
     return(ExchangeSelections.Select(e => e.ToString()));
 }