using System.Collections.Generic;
using System.Threading.Tasks;
private ILoaderService<(int Id, string Name)> DrinkService { get; set; }
private ILoaderService<(int Id, int Price)> PriceService { get; set; }
DrinkService = new DrinkLoaderServiceMock();
PriceService = new PriceLoaderServiceMock();
public void ToggleOrder() {
Console.WriteLine("drinkList reversed: ");
List<(int Id, string Name)> drinkList = DrinkService.LoadAsync().Result;
foreach(var drink in drinkList)
Console.WriteLine(drink.Name);
public void SetFilter(string? containedString) {
Console.WriteLine("drinks filter by '" + containedString + "' are: ");
foreach(var drink in DrinkService.LoadAsync().Result)
if (containedString != null && drink.Name.Contains(containedString))
Console.WriteLine(drink.Name);
private Task<IEnumerable<Drink>> LoadDrinksAsync()
List<(int Id, string Name)> drinkList = DrinkService.LoadAsync().Result;
List<(int Id, int Price)> priceList = PriceService.LoadAsync().Result;
List<Drink> drinkListTmp = new List<Drink>();
foreach(var drink in drinkList)
foreach(var price in priceList)
if (drink.Id == price.Id && (tmpPrice == 0 || tmpPrice < price.Price))
drinkListTmp.Add(new Drink(drink.Name, tmpPrice));
IEnumerable<Drink>? result = drinkListTmp;
public async Task GetMenuAsync() {
var drinks = await LoadDrinksAsync();
Console.WriteLine("💣💣💣 Sorry, we could not load Kampaay drink list because of network errors 💣💣💣 ");
DrinksExtensions de = new DrinksExtensions();
drinks = de.Sort(drinks, "DESC");
Console.WriteLine("🎉🎉🎉 KAMPAAY BAR DRINK LIST 🎉🎉🎉");
de.PrintCheapest(drinks);
public string Name { get; set; }
public int Price { get; set; }
public Drink(string name, int price)
public class DrinksExtensions
public IEnumerable<Drink> Sort(IEnumerable<Drink> drinkList, string order)
if (order.ToUpper() == "ASC")
drinkList = drinkList.OrderBy(drink => drink.Price).ThenBy(drink => drink.Name);
if (order.ToUpper() == "DESC")
drinkList = drinkList.OrderByDescending(drink => drink.Price).ThenByDescending(drink => drink.Name);
public void Print(IEnumerable<Drink> drinkList)
foreach(var drink in drinkList)
Console.WriteLine(drink.Name + ": " + drink.Price + "€");
public void PrintCheapest(IEnumerable<Drink> drinkList)
drinkList = Sort(drinkList, "ASC");
Console.WriteLine("cheapest drink is " + drinkList.First().Name + ": " + drinkList.First().Price + "€");
public interface ILoaderService<TData> {
Task<List<TData>> LoadAsync();
public abstract class LoaderService<TData> : ILoaderService<TData> {
private readonly Random _rnd = new Random();
protected async Task<List<TData>> EmulateNetworkAsync(List<TData> mock){
var delay = _rnd.Next(-50, 100);
await Task.Delay(Math.Abs(delay));
throw new Exception("💣💣💣 service data load failed!");
public abstract Task<List<TData>> LoadAsync();
public class DrinkLoaderServiceMock : LoaderService<(int Id, string Name)> {
public override Task<List<(int Id, string Name)>> LoadAsync()
=> EmulateNetworkAsync(new List<(int Id, string Name)>() {
public class PriceLoaderServiceMock : LoaderService<(int Id, int Price)> {
public override Task<List<(int Id, int Price)>> LoadAsync()
=> EmulateNetworkAsync(new List<(int Id, int Price)>() {
public static async Task Main()
var drinkList = new DrinkList();
Console.WriteLine("FIRST MENU LOAD");
await drinkList.GetMenuAsync();
drinkList.SetFilter("M");
Console.WriteLine("SECOND MENU LOAD");
await drinkList.GetMenuAsync();
drinkList.SetFilter("a");
Console.WriteLine("THIRD MENU LOAD");
await drinkList.GetMenuAsync();