using System.Collections.Generic;
using System.Threading.Tasks;
private const string BaseUrl = "https://jsonmock.hackerrank.com/api/tvseries";
private static readonly HttpClient HttpClient = new();
private static readonly BestTvSeriesComparer BestTvSeriesComparer = new();
public static string? bestInGenre(string genre)
return FindBestTvSeriesAsync(genre).GetAwaiter().GetResult();
private static async Task<string?> FindBestTvSeriesAsync(string genre)
int currentPage = 1, totalPages = default;
TvSeries? bestSeries = null;
var response = await GetTvSeriesPerPageAsync(currentPage);
if (response is null) break;
totalPages = response.TotalPages;
var seriesWithHighestScore = FindBestSeries(genre, response.Data);
bestSeries = seriesWithHighestScore;
else if (seriesWithHighestScore is not null)
bestSeries = BestTvSeriesComparer.Compare(bestSeries, seriesWithHighestScore) > 0
: seriesWithHighestScore;
while(currentPage <= totalPages);
private static async Task<Response?> GetTvSeriesPerPageAsync(int page)
var response = await HttpClient.GetAsync($"{BaseUrl}?page={page}");
response.EnsureSuccessStatusCode();
var jsonResponse = await response.Content.ReadAsStringAsync();
var pageResult = JsonConvert.DeserializeObject<Response>(jsonResponse);
private static TvSeries? FindBestSeries(string genre, IReadOnlyCollection<TvSeries> tvSeries)
.Where(c => c.Genre.Split(",", StringSplitOptions.TrimEntries).Contains(genre))
.Order(BestTvSeriesComparer)
internal sealed class BestTvSeriesComparer : IComparer<TvSeries>
public int Compare(TvSeries x, TvSeries y)
var result = x.ImdbRating.CompareTo(y.ImdbRating);
result = string.Compare(x.Name, y.Name, StringComparison.Ordinal);
internal sealed record Response
[JsonProperty("total_pages")]
public required int TotalPages { get; init; }
public required IReadOnlyCollection<TvSeries> Data { get; init; }
public sealed record TvSeries
public required string Name { get; init; }
public required string Genre { get; init; }
[JsonProperty("imdb_rating")]
public required double ImdbRating { get; init; }
public static void Main(string[] args)
string result = Result.bestInGenre("Action");