private dynamic GetCountryDailyStatsInSerial(string country) { try { // https://corona.lmao.ninja/v2/historical/Philippines?lastdays=300 var response = Client.GetAsync("https://corona.lmao.ninja/v2/historical/" + country + "?lastdays=300"); response.Wait(); var result = response.Result.Content.ReadAsStringAsync().Result; dynamic jObject = JsonConvert.DeserializeObject(result); List <string> items = new List <string>(); Dictionary <string, int> confirmed = jObject.timeline.cases.ToObject <Dictionary <string, int> >(); Dictionary <string, int> recovered = jObject.timeline.recovered.ToObject <Dictionary <string, int> >(); Dictionary <string, int> deaths = jObject.timeline.deaths.ToObject <Dictionary <string, int> >(); List <DailyStats> c = new List <DailyStats>(); List <DailyStats> r = new List <DailyStats>(); List <DailyStats> d = new List <DailyStats>(); dynamic retVal = new ExpandoObject(); retVal.Country = country; { var yesterdayConfirmed = 0; var keyList = new List <string>(confirmed.Keys); // compute daily changes for confirmed cases for (int i = 0; i < keyList.Count; i++) { if ((i - 1) < 0) { continue; } yesterdayConfirmed = confirmed[keyList[i - 1]]; var todayDate = keyList[i]; var todayConfirmed = confirmed[keyList[i]]; var todayChangesFromYesterday = todayConfirmed - yesterdayConfirmed; var stats = new DailyConfirmed() { Date = todayDate, NewConfirmed = todayChangesFromYesterday, Value = todayConfirmed }; c.Add(stats); } } { var yesterdayRecovered = 0; var keyList = new List <string>(recovered.Keys); // compute daily changes for confirmed cases for (int i = 0; i < keyList.Count; i++) { if ((i - 1) < 0) { continue; } yesterdayRecovered = recovered[keyList[i - 1]]; var todayDate = keyList[i]; var todayRecovered = recovered[keyList[i]]; var todayChangesFromYesterday = todayRecovered - yesterdayRecovered; var stats = new DailyRecoveries() { Date = todayDate, NewRecoveries = todayChangesFromYesterday, Value = todayRecovered }; r.Add(stats); } } { var yesterdayDeaths = 0; var keyList = new List <string>(deaths.Keys); // compute daily changes for deaths for (int i = 0; i < keyList.Count; i++) { if ((i - 1) < 0) { continue; } yesterdayDeaths = deaths[keyList[i - 1]]; var todayDate = keyList[i]; var todayDeaths = deaths[keyList[i]]; var todayChangesFromYesterday = todayDeaths - yesterdayDeaths; var stats = new DailyDeaths() { Date = todayDate, NewDeaths = todayChangesFromYesterday, Value = todayDeaths }; d.Add(stats); } } c.OrderBy(stats => stats.Date); r.OrderBy(stats => stats.Date); d.OrderBy(stats => stats.Date); retVal.confirmed = c; retVal.recovered = r; retVal.deaths = d; return(retVal); } catch { return(null); } }
private dynamic GetCountryDailyStatsInParallel(string country) { try { // https://corona.lmao.ninja/v2/historical/Philippines?lastdays=300 using (var multiThreadedClient = new HttpClient()) { var response = multiThreadedClient.GetAsync("https://corona.lmao.ninja/v2/historical/" + country + "?lastdays=300"); response.Wait(); var result = response.Result.Content.ReadAsStringAsync().Result; dynamic jObject = JsonConvert.DeserializeObject(result); List <string> items = new List <string>(); Dictionary <string, int> confirmed = jObject.timeline.cases.ToObject <Dictionary <string, int> >(); Dictionary <string, int> recovered = jObject.timeline.recovered.ToObject <Dictionary <string, int> >(); Dictionary <string, int> deaths = jObject.timeline.deaths.ToObject <Dictionary <string, int> >(); ConcurrentQueue <DailyStats> c = new ConcurrentQueue <DailyStats>(); ConcurrentQueue <DailyStats> r = new ConcurrentQueue <DailyStats>(); ConcurrentQueue <DailyStats> d = new ConcurrentQueue <DailyStats>(); dynamic retVal = new ExpandoObject(); retVal.Country = country; // for each day, get the daily changes for confirmed/recovered/deaths Parallel.Invoke( // process confirmed cases at the same time () => { var yesterdayConfirmed = 0; var keyList = new List <string>(confirmed.Keys); // compute daily changes for confirmed cases Parallel.For(0, keyList.Count, (i) => { if ((i - 1) > 0) { yesterdayConfirmed = confirmed[keyList[i - 1]]; var todayDate = keyList[i]; var todayConfirmed = confirmed[keyList[i]]; var todayChangesFromYesterday = todayConfirmed - yesterdayConfirmed; var stats = new DailyConfirmed() { Date = todayDate, NewConfirmed = todayChangesFromYesterday, Value = todayConfirmed }; c.Enqueue(stats); } }); }, // process recovered cases at the same time () => { var yesterdayRecovered = 0; var keyList = new List <string>(recovered.Keys); // compute daily changes for confirmed cases Parallel.For(0, keyList.Count, (i) => { if ((i - 1) > 0) { yesterdayRecovered = recovered[keyList[i - 1]]; var todayDate = keyList[i]; var todayRecovered = recovered[keyList[i]]; var todayChangesFromYesterday = todayRecovered - yesterdayRecovered; var stats = new DailyRecoveries() { Date = todayDate, NewRecoveries = todayChangesFromYesterday, Value = todayRecovered }; r.Enqueue(stats); } }); }, // process deaths at the same time () => { var yesterdayDeaths = 0; var keyList = new List <string>(deaths.Keys); // compute daily changes for deaths Parallel.For(0, keyList.Count, (i) => { if ((i - 1) > 0) { yesterdayDeaths = deaths[keyList[i - 1]]; var todayDate = keyList[i]; var todayDeaths = deaths[keyList[i]]; var todayChangesFromYesterday = todayDeaths - yesterdayDeaths; var stats = new DailyDeaths() { Date = todayDate, NewDeaths = todayChangesFromYesterday, Value = todayDeaths }; d.Enqueue(stats); } }); } ); Parallel.Invoke( () => { c.OrderBy(stats => stats.Date); }, () => { r.OrderBy(stats => stats.Date); }, () => { d.OrderBy(stats => stats.Date); } ); retVal.confirmed = c; retVal.recovered = r; retVal.deaths = d; return(retVal); } } catch { return(null); } }