Advertisement
b_gandurov

Untitled

May 21st, 2024
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.42 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5.  
  6. class Program
  7. {
  8.     static void Main()
  9.     {
  10.         var items = new SortedDictionary<string, Tuple<double, string>>();
  11.         var itemsByType = new Dictionary<string, SortedSet<string>>();
  12.         var itemsByPrice = new SortedDictionary<double, SortedSet<string>>();
  13.  
  14.         while (true)
  15.         {
  16.             string input = Console.ReadLine();
  17.             if (input == "end")
  18.             {
  19.                 break;
  20.             }
  21.  
  22.             var inputElements = input.Split();
  23.             var command = inputElements[0];
  24.  
  25.             switch (command)
  26.             {
  27.                 case "add":
  28.                     string name = inputElements[1];
  29.                     double price = double.Parse(inputElements[2], CultureInfo.InvariantCulture);
  30.                     string itemType = inputElements[3];
  31.                     if (items.ContainsKey(name))
  32.                     {
  33.                         Console.WriteLine($"Error: Item {name} already exists");
  34.                     }
  35.                     else
  36.                     {
  37.                         items[name] = Tuple.Create(price, itemType);
  38.                         if (!itemsByType.ContainsKey(itemType))
  39.                         {
  40.                             itemsByType[itemType] = new SortedSet<string>();
  41.                         }
  42.                         itemsByType[itemType].Add(name);
  43.  
  44.                         if (!itemsByPrice.ContainsKey(price))
  45.                         {
  46.                             itemsByPrice[price] = new SortedSet<string>();
  47.                         }
  48.                         itemsByPrice[price].Add(name);
  49.  
  50.                         Console.WriteLine($"Ok: Item {name} added successfully");
  51.                     }
  52.                     break;
  53.  
  54.                 case "filter":
  55.                     var filterType = inputElements[2];
  56.                     if (filterType == "type")
  57.                     {
  58.                         FilterByType(inputElements[3], items, itemsByType);
  59.                     }
  60.                     else if (filterType == "price")
  61.                     {
  62.                         if (inputElements.Length == 7)
  63.                         {
  64.                             double minPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
  65.                             double maxPrice = double.Parse(inputElements[6], CultureInfo.InvariantCulture);
  66.                             FilterByPriceRange(minPrice, maxPrice, items, itemsByPrice);
  67.                         }
  68.                         else if (inputElements[3] == "from")
  69.                         {
  70.                             double minPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
  71.                             FilterByPriceFrom(minPrice, items, itemsByPrice);
  72.                         }
  73.                         else if (inputElements[3] == "to")
  74.                         {
  75.                             double maxPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
  76.                             FilterByPriceTo(maxPrice, items, itemsByPrice);
  77.                         }
  78.                     }
  79.                     break;
  80.             }
  81.         }
  82.     }
  83.  
  84.     static void FilterByType(string itemType, SortedDictionary<string, Tuple<double, string>> items, Dictionary<string, SortedSet<string>> itemsByType)
  85.     {
  86.         if (!itemsByType.ContainsKey(itemType))
  87.         {
  88.             Console.WriteLine($"Error: Type {itemType} does not exist");
  89.             return;
  90.         }
  91.  
  92.         var filteredItems = itemsByType[itemType]
  93.             .Select(name => new { Name = name, Item = items[name] })
  94.             .OrderBy(price => price.Item.Item1)
  95.             .ThenBy(name => name.Name)
  96.             .ThenBy(type => type.Item.Item2)
  97.             .Take(10)
  98.             .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
  99.             .ToList();
  100.  
  101.         PrintFilteredItems(filteredItems);
  102.     }
  103.  
  104.     static void FilterByPriceRange(double minPrice, double maxPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
  105.     {
  106.         var filteredItems = itemsByPrice
  107.             .Where(kv => kv.Key >= minPrice && kv.Key <= maxPrice)
  108.             .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
  109.             .OrderBy(price => price.Item.Item1)
  110.             .ThenBy(name => name.Name)
  111.             .ThenBy(type => type.Item.Item2)
  112.             .Take(10)
  113.             .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
  114.             .ToList();
  115.  
  116.         PrintFilteredItems(filteredItems);
  117.     }
  118.  
  119.     static void FilterByPriceFrom(double minPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
  120.     {
  121.         var filteredItems = itemsByPrice
  122.             .Where(kv => kv.Key >= minPrice)
  123.             .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
  124.             .OrderBy(price => price.Item.Item1)
  125.             .ThenBy(name => name.Name)
  126.             .ThenBy(type => type.Item.Item2)
  127.             .Take(10)
  128.             .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
  129.             .ToList();
  130.  
  131.         PrintFilteredItems(filteredItems);
  132.     }
  133.  
  134.     static void FilterByPriceTo(double maxPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
  135.     {
  136.         var filteredItems = itemsByPrice
  137.             .Where(kv => kv.Key <= maxPrice)
  138.             .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
  139.             .OrderBy(price => price.Item.Item1)
  140.             .ThenBy(name => name.Name)
  141.             .ThenBy(type => type.Item.Item2)
  142.             .Take(10)
  143.             .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
  144.             .ToList();
  145.  
  146.         PrintFilteredItems(filteredItems);
  147.     }
  148.  
  149.     static void PrintFilteredItems(List<string> filteredItems)
  150.     {
  151.         if (filteredItems.Any())
  152.         {
  153.             Console.WriteLine($"Ok: {string.Join(", ", filteredItems)}");
  154.         }
  155.         else
  156.         {
  157.             Console.WriteLine("Ok: ");
  158.         }
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement