Advertisement
svetlai

Events

Dec 2nd, 2015
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.71 KB | None | 0 0
  1. namespace Events
  2. {
  3.     using System;
  4.     using System.Collections.Generic;
  5.     using System.Linq;
  6.     using System.Text;
  7.     using System.Threading.Tasks;
  8.     using System.Globalization;
  9.     using System.Security.Cryptography.X509Certificates;
  10.     using Wintellect.PowerCollections;
  11.  
  12.  
  13.     public class Program
  14.     {
  15.         //static SortedDictionary<string, List<Event>> byDate = new SortedDictionary<string, List<Event>>();
  16.         static Dictionary<string, List<Event>> byTitle = new Dictionary<string, List<Event>>();
  17.         static OrderedMultiDictionary<DateTime, Event> byDate = new OrderedMultiDictionary<DateTime, Event>(true);
  18.         //static SortedSet<string> dates = new SortedSet<string>();
  19.  
  20.         static StringBuilder sb = new StringBuilder();
  21.  
  22.         public static void Main()
  23.         {
  24.             while (true)
  25.             {
  26.                 var line = Console.ReadLine();
  27.  
  28.                 if (line == "End")
  29.                 {
  30.                     break;
  31.                 }
  32.  
  33.                 var commandEndIndex = line.IndexOf(" ");
  34.                 var commandName = line.Substring(0, commandEndIndex);
  35.  
  36.                 var command = line.Substring(commandEndIndex + 1).Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToArray();
  37.  
  38.                 if (commandName == "AddEvent")
  39.                 {
  40.                     //var date = command[0];
  41.                     DateTime date = DateTime.ParseExact(command[0], "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
  42.  
  43.                     var ev = new Event(date, command[1]);
  44.                     if (command.Length > 2)
  45.                     {
  46.                         ev.Location = command[2];
  47.                     }
  48.  
  49.                     if (!byDate.ContainsKey(date))
  50.                     {
  51.                         byDate[date] = new List<Event>();
  52.                     }
  53.  
  54.                     if (!byTitle.ContainsKey(command[1].ToLower()))
  55.                     {
  56.                         byTitle[command[1].ToLower()] = new List<Event>();
  57.                     }
  58.  
  59.                     byDate[date].Add(ev);
  60.                     byTitle[command[1].ToLower()].Add(ev);
  61.                     //dates.Add(ev.Date);
  62.  
  63.                     sb.AppendLine("Event added");
  64.                 }
  65.                 else if (commandName == "DeleteEvents")
  66.                 {
  67.                     if (!byTitle.ContainsKey(command[0].ToLower()))
  68.                     {
  69.                         sb.AppendLine("No events found");
  70.                         continue;
  71.                     }
  72.  
  73.                     var toDelete = byTitle[command[0].ToLower()];
  74.                     int count = toDelete.Count;
  75.  
  76.                     if (toDelete.Count == 0)
  77.                     {
  78.                         sb.AppendLine("No events found");
  79.                         continue;
  80.                     }
  81.  
  82.                     foreach (var ev in toDelete)
  83.                     {
  84.                         byDate[ev.Date].Remove(ev);
  85.                     }
  86.  
  87.                     byTitle.Remove(command[0].ToLower());
  88.  
  89.                     sb.AppendLine(string.Format("{0} events deleted", count));
  90.                 }
  91.                 else
  92.                 {
  93.                     //var date = command[0];
  94.                     DateTime date = DateTime.ParseExact(command[0], "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);
  95.                     //var datesList = command[0].CompareTo(dates.Last()) < 0 ? dates.GetViewBetween(command[0], dates.Last()) : new SortedSet<string>();
  96.  
  97.                     //var toList = new List<Event>();
  98.                     //foreach (var date in datesList)
  99.                     //{
  100.                     //    toList.AddRange(byDate[date]);
  101.                     //}
  102.  
  103.                     //toList.OrderBy(x => x.Date)
  104.                     //    .ThenBy(x => x.Name)
  105.                     //    .ThenBy(x => x.Location)
  106.                     //    .Take(int.Parse(command[1]))
  107.                     //    .ToList();
  108.                    
  109.                     var toList = byDate.RangeFrom(date, true)
  110.                         .Values
  111.                         .Take(int.Parse(command[1]))
  112.                         .ToList();
  113.                         //.SelectMany(e => e.Value)
  114.                         //.OrderBy(x => x.Date)
  115.                         //.ThenBy(x => x.Name)
  116.                         //.ThenBy(x => x.Location)
  117.                         //.Take(int.Parse(command[1]))
  118.                         //.ToList();
  119.                     //var toList = byDate
  120.                     //    .Where(x => x.Key.CompareTo(command[0]) >= 0)
  121.                     //    .SelectMany(e => e.Value)
  122.                     //    .OrderBy(x => x.Date)
  123.                     //    .ThenBy(x => x.Name)
  124.                     //    .ThenBy(x => x.Location)
  125.                     //    .Take(int.Parse(command[1]))
  126.                     //    .ToList();
  127.  
  128.                     if (toList.Count == 0)
  129.                     {
  130.                         sb.AppendLine("No events found");
  131.                         continue;
  132.                     }
  133.  
  134.                     foreach (var ev in toList)
  135.                     {
  136.                         sb.AppendLine(ev.ToString());
  137.                     }
  138.                 }
  139.             }
  140.  
  141.             Console.WriteLine(sb.ToString().Trim());
  142.         }
  143.     }
  144.  
  145.     public class Event : IComparable
  146.     {
  147.         public Event(DateTime date, string name)
  148.         {
  149.             this.Date = date;
  150.             this.Name = name;
  151.             this.Location = string.Empty;
  152.         }
  153.  
  154.         public Event(DateTime date, string name, string location)
  155.             : this(date, name)
  156.         {
  157.             this.Location = location;
  158.         }
  159.  
  160.         //2012-01-21T20:00:00
  161.        // public string Date { get; set; }
  162.  
  163.         public DateTime Date { get; set; }
  164.  
  165.         public string Name { get; set; }
  166.  
  167.         public string Location { get; set; }
  168.  
  169.         public override string ToString()
  170.         {
  171.             if (string.IsNullOrEmpty(this.Location))
  172.             {
  173.                 return string.Format("{0:yyyy-MM-ddTHH:mm:ss} | {1}", this.Date, this.Name);
  174.             }
  175.  
  176.             return string.Format("{0:yyyy-MM-ddTHH:mm:ss} | {1} | {2}", this.Date, this.Name, this.Location);
  177.         }
  178.  
  179.         public int CompareTo(object obj)
  180.         {
  181.             var other = obj as Event;
  182.             var comparer = this.Date.CompareTo(other.Date);
  183.  
  184.             if (comparer == 0)
  185.             {
  186.                 comparer = this.Name.CompareTo(other.Name);
  187.  
  188.                 if (comparer == 0)
  189.                 {
  190.                     comparer = this.Location.CompareTo(other.Location);
  191.                 }
  192.             }
  193.  
  194.             return comparer;
  195.         }
  196.     }
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement