Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
            }
        }