Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Globalization;
- using System.Linq;
- class Program
- {
- static void Main()
- {
- var items = new SortedDictionary<string, Tuple<double, string>>();
- var itemsByType = new Dictionary<string, SortedSet<string>>();
- var itemsByPrice = new SortedDictionary<double, SortedSet<string>>();
- while (true)
- {
- string input = Console.ReadLine();
- if (input == "end")
- {
- break;
- }
- var inputElements = input.Split();
- var command = inputElements[0];
- switch (command)
- {
- case "add":
- string name = inputElements[1];
- double price = double.Parse(inputElements[2], CultureInfo.InvariantCulture);
- string itemType = inputElements[3];
- if (items.ContainsKey(name))
- {
- Console.WriteLine($"Error: Item {name} already exists");
- }
- else
- {
- items[name] = Tuple.Create(price, itemType);
- if (!itemsByType.ContainsKey(itemType))
- {
- itemsByType[itemType] = new SortedSet<string>();
- }
- itemsByType[itemType].Add(name);
- if (!itemsByPrice.ContainsKey(price))
- {
- itemsByPrice[price] = new SortedSet<string>();
- }
- itemsByPrice[price].Add(name);
- Console.WriteLine($"Ok: Item {name} added successfully");
- }
- break;
- case "filter":
- var filterType = inputElements[2];
- if (filterType == "type")
- {
- FilterByType(inputElements[3], items, itemsByType);
- }
- else if (filterType == "price")
- {
- if (inputElements.Length == 7)
- {
- double minPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
- double maxPrice = double.Parse(inputElements[6], CultureInfo.InvariantCulture);
- FilterByPriceRange(minPrice, maxPrice, items, itemsByPrice);
- }
- else if (inputElements[3] == "from")
- {
- double minPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
- FilterByPriceFrom(minPrice, items, itemsByPrice);
- }
- else if (inputElements[3] == "to")
- {
- double maxPrice = double.Parse(inputElements[4], CultureInfo.InvariantCulture);
- FilterByPriceTo(maxPrice, items, itemsByPrice);
- }
- }
- break;
- }
- }
- }
- static void FilterByType(string itemType, SortedDictionary<string, Tuple<double, string>> items, Dictionary<string, SortedSet<string>> itemsByType)
- {
- if (!itemsByType.ContainsKey(itemType))
- {
- Console.WriteLine($"Error: Type {itemType} does not exist");
- return;
- }
- var filteredItems = itemsByType[itemType]
- .Select(name => new { Name = name, Item = items[name] })
- .OrderBy(price => price.Item.Item1)
- .ThenBy(name => name.Name)
- .ThenBy(type => type.Item.Item2)
- .Take(10)
- .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
- .ToList();
- PrintFilteredItems(filteredItems);
- }
- static void FilterByPriceRange(double minPrice, double maxPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
- {
- var filteredItems = itemsByPrice
- .Where(kv => kv.Key >= minPrice && kv.Key <= maxPrice)
- .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
- .OrderBy(price => price.Item.Item1)
- .ThenBy(name => name.Name)
- .ThenBy(type => type.Item.Item2)
- .Take(10)
- .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
- .ToList();
- PrintFilteredItems(filteredItems);
- }
- static void FilterByPriceFrom(double minPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
- {
- var filteredItems = itemsByPrice
- .Where(kv => kv.Key >= minPrice)
- .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
- .OrderBy(price => price.Item.Item1)
- .ThenBy(name => name.Name)
- .ThenBy(type => type.Item.Item2)
- .Take(10)
- .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
- .ToList();
- PrintFilteredItems(filteredItems);
- }
- static void FilterByPriceTo(double maxPrice, SortedDictionary<string, Tuple<double, string>> items, SortedDictionary<double, SortedSet<string>> itemsByPrice)
- {
- var filteredItems = itemsByPrice
- .Where(kv => kv.Key <= maxPrice)
- .SelectMany(kv => kv.Value.Select(name => new { Name = name, Item = items[name] }))
- .OrderBy(price => price.Item.Item1)
- .ThenBy(name => name.Name)
- .ThenBy(type => type.Item.Item2)
- .Take(10)
- .Select(element => $"{element.Name}({element.Item.Item1.ToString("F2", CultureInfo.InvariantCulture)})")
- .ToList();
- PrintFilteredItems(filteredItems);
- }
- static void PrintFilteredItems(List<string> filteredItems)
- {
- if (filteredItems.Any())
- {
- Console.WriteLine($"Ok: {string.Join(", ", filteredItems)}");
- }
- else
- {
- Console.WriteLine("Ok: ");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement