static void Main(string[] args)
        {
            // Пример использования. 
            var dict = new CompositeKeyDictionary<Person, Address, House>();
            var ind = 1;
            var addressToSelect = new Address($"Country_{ind}", $"City{ind}", $"Street_{ind}", ind);
            Person personToSelect;

            FillDictionary(dict, out personToSelect);

            Console.WriteLine("All items:");
            foreach (var item in dict)
            {
                Console.WriteLine(item.ToString());
            }
            Console.WriteLine();
           
            Console.WriteLine($"Selected by address: {addressToSelect}");
            foreach (var item in dict.GetValuesByKey2(addressToSelect))
            {
                Console.WriteLine(item.ToString());
            }
            Console.WriteLine();

            Console.WriteLine($"Selected by person: {personToSelect}");
            foreach (var item in dict.GetValuesByKey1(personToSelect))
            {
                Console.WriteLine(item.ToString());
            }

            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            // Пример использования.
            var    dict            = new CompositeKeyDictionary <Person, Address, House>();
            var    ind             = 1;
            var    addressToSelect = new Address($"Country_{ind}", $"City{ind}", $"Street_{ind}", ind);
            Person personToSelect;

            FillDictionary(dict, out personToSelect);

            Console.WriteLine("All items:");
            foreach (var item in dict)
            {
                Console.WriteLine(item.ToString());
            }
            Console.WriteLine();

            Console.WriteLine($"Selected by address: {addressToSelect}");
            foreach (var item in dict.GetValuesByKey2(addressToSelect))
            {
                Console.WriteLine(item.ToString());
            }
            Console.WriteLine();

            Console.WriteLine($"Selected by person: {personToSelect}");
            foreach (var item in dict.GetValuesByKey1(personToSelect))
            {
                Console.WriteLine(item.ToString());
            }

            Console.ReadLine();
        }
        public void ConcurrencyTest()
        {
            //test adding elements
            var dictionary = new CompositeKeyDictionary<Guid, int, object>();
            var tasks = new Task[tasksCount];
            var ids = new Tuple<Guid,int>[tasksCount * stepsPerTask];
            for (int x = 0; x < tasksCount; ++x)
            {
                int xCopy = x;
                tasks[xCopy] = (new Task(() =>
                {
                    int step = 0;
                    foreach (var data in GetRandomData(stepsPerTask))
                    {
                        dictionary[data] = data;
                        //we need this collection for further removal
                        ids[xCopy * stepsPerTask + step] = data;
                        step += 1;
                    }
                }));
            }

            foreach(var t in tasks)
            {
                t.Start();
            }

            Task.WaitAll(tasks);
            Assert.AreEqual(stepsPerTask * tasksCount, dictionary.Count());

            //test removing elements
            for (int x = 0; x < tasksCount; x++)
            {
                int xCopy = x;
                tasks[xCopy] = (new Task(() =>
                {
                    int removalsRemaining = stepsPerTask;
                    while (removalsRemaining > 0)
                    {
                        bool result = dictionary.Remove(ids[stepsPerTask * xCopy + removalsRemaining - 1]);
                        if (result)
                        {
                            removalsRemaining -= 1;
                        }
                    }
                }));
            }

            foreach (var t in tasks)
            {
                t.Start();
            }

            Task.WaitAll(tasks);
            Assert.AreEqual(0, dictionary.Count());
        }
        /// <summary>
        ///     Creates new instatnce of <see cref="CompositeKeyDictionary{UserId,string,User}" /> that contains 5 elements.
        /// </summary>
        /// <returns></returns>
        public static CompositeKeyDictionary <UserId, string, User> CreateDictionary()
        {
            var dictionary = new CompositeKeyDictionary <UserId, string, User>();

            foreach (var user in UserList)
            {
                dictionary.Add(user);
            }
            return(dictionary);
        }
 private static void FillDictionary(CompositeKeyDictionary<Person, Address, House> dict, out Person personToSelect)
 {
     Person person = new Person(0, $"Name_{0}");
     personToSelect = person;
     const int cycleConst = 5;
     for (int i = 1; i <= 15; ++i)
     {
         if (i % cycleConst == 0)
         {
             person = new Person(i / cycleConst, $"Name_{i / cycleConst}");
         }
         dict.Add(person,
             new Address($"Country_{i % cycleConst}", $"City{i % cycleConst}", $"Street_{i % cycleConst}", i % cycleConst),
             new House($"Color_{i}", i));
     }
 }
        private static void FillDictionary(CompositeKeyDictionary <Person, Address, House> dict, out Person personToSelect)
        {
            Person person = new Person(0, $"Name_{0}");

            personToSelect = person;
            const int cycleConst = 5;

            for (int i = 1; i <= 15; ++i)
            {
                if (i % cycleConst == 0)
                {
                    person = new Person(i / cycleConst, $"Name_{i / cycleConst}");
                }
                dict.Add(person,
                         new Address($"Country_{i % cycleConst}", $"City{i % cycleConst}", $"Street_{i % cycleConst}", i % cycleConst),
                         new House($"Color_{i}", i));
            }
        }
        public void TestIndiciesPerformance()
        {
            var dictionary = new CompositeKeyDictionary<Guid, int, object>();
            var data = GetRandomData(dictSize);

            var stopWatch = new Stopwatch();
            stopWatch.Start();
            foreach (var x in data)
            {
                dictionary.Add(x, x);
            }

            var timeToBuiltDictionaryWithIndicies = stopWatch.ElapsedMilliseconds;

            // Time to build Dict without indicies
            dictionary.Clear();
            dictionary.UseIndices = false;
            stopWatch.Restart();
            foreach (var x in data)
            {
                dictionary.Add(x, x);
            }
            var timeToBuiltDictionaryWithOutIndicies = stopWatch.ElapsedMilliseconds;

            //Time required to rebuilt two indicies
            stopWatch.Restart();
            dictionary.UseIndices = true;
            var timeToRebuiltIndices = stopWatch.ElapsedMilliseconds;

            // Get speed with index access
            stopWatch.Restart();
            var xs = dictionary[data.First().Item2].ToList();
            var timeToAccessWithIndices = stopWatch.ElapsedMilliseconds;

            // Now turn it off
            dictionary.UseIndices = false;
            stopWatch.Restart();
            xs = dictionary[data.First().Item2].ToList();
            var timeToAccessWithOutIndices = stopWatch.ElapsedMilliseconds;

            Trace.WriteLine(string.Format("Performance results for dictSize = {0} and busketSize = {1}", dictSize, busketSize));
            Trace.WriteLine("timeToBuiltDictionaryWithIndicies: " + timeToBuiltDictionaryWithIndicies);
            Trace.WriteLine("timeToBuiltDictionaryWithOutIndicies: " + timeToBuiltDictionaryWithOutIndicies);
            Trace.WriteLine("timeToRebuiltIndices: " + timeToRebuiltIndices);
            Trace.WriteLine("timeToAccessWithIndices: " + timeToAccessWithIndices);
            Trace.WriteLine("timeToAccessWithOutIndices: " + timeToAccessWithOutIndices);
            Trace.WriteLine("----------------------------------------------------------------");
        }
 public void MyTestCleanup()
 {
     _dict = null;
 }
 public void MyTestInitialize()
 {
     _dict = new CompositeKeyDictionary <Person, Address, House>();
 }
  public void MyTestCleanup()
 {
     _dict = null;
 }
 public void MyTestInitialize()
 {
     _dict = new CompositeKeyDictionary<Person, Address, House>();
 }