/// <summary>
        ///  Method providing functionality for adding phone contacts into the phone repo
        /// </summary>
        /// <param name="name">name of the contact</param>
        /// <param name="numbersArray">Array of numbers</param>
        /// <returns></returns>
        public bool AddPhone(string name, IEnumerable<string> numbersArray)
        {
            string nameToLower = name.ToLowerInvariant();

            PhonebookList entry;

            bool isNewPhone = !this.dictionary.TryGetValue(nameToLower, out entry);

            if (isNewPhone)
            {
                entry = new PhonebookList();
                entry.Name = name;
                entry.Strings = new SortedSet<string>();
                this.dictionary.Add(nameToLower, entry);
                this.sortedPhonebookList.Add(entry);
            }

            foreach (var phoneNumber in numbersArray)
            {
                this.mutliDictionary.Add(phoneNumber, entry);
            }

            entry.Strings.UnionWith(numbersArray);
            return isNewPhone;
        }
        /// <summary>
        /// Method for adding phone in the repository
        /// </summary>
        /// <param name="name">Contact Name </param>
        /// <param name="phoneNumbers">Array of phone Numbers</param>
        /// <returns></returns>
        public bool AddPhone(string name, IEnumerable<string> phoneNumbers)
        {
            var old =
                from entry in this.listOfPhones
                where entry.Name.ToLowerInvariant() == name.ToLowerInvariant()
                select entry;

            bool oldPhonesFound;

            if (old.Count() == 0)
            {
                PhonebookList newPhoneList = new PhonebookList();
                newPhoneList.Name = name;
                newPhoneList.Strings = new SortedSet<string>();

                foreach (var num in phoneNumbers)
                {
                    newPhoneList.Strings.Add(num);
                }

                this.listOfPhones.Add(newPhoneList);

                oldPhonesFound = true;
            }
            else if (old.Count() == 1)
            {
                PhonebookList phoneContact = old.First();
                foreach (var num in phoneNumbers)
                {
                    phoneContact.Strings.Add(num);
                }

                oldPhonesFound = false;
            }
            else
            {
                Console.WriteLine("Duplicated name in the phonebook found: " + name);
                return false;
            }

            return oldPhonesFound;
        }
        /// <summary>
        /// Method providing functionality for listing of phone contacts
        /// </summary>
        /// <param name="startIndex">start index of the list</param>
        /// <param name="sizeOfPage">Size of the page to be displayed</param>
        /// <returns></returns>
        public PhonebookList[] ListEntries(int startIndex, int sizeOfPage)
        {
            if (startIndex < 0 || startIndex + sizeOfPage > this.listOfPhones.Count)
            {
                throw new ArgumentOutOfRangeException("Invalid start index or count.");
            }

            this.listOfPhones.Sort();

            PhonebookList[] phonebookList = new PhonebookList[sizeOfPage];

            for (int index = startIndex; index <= startIndex + sizeOfPage - 1; index++)
            {
                PhonebookList entry = this.listOfPhones[index];
                phonebookList[index - startIndex] = entry;
            }

            return phonebookList;
        }
        /// <summary>
        /// Method providing funcitonality for listing contacts
        /// </summary>
        /// <param name="startIndex">Start index of the List</param>
        /// <param name="sizeOfPage">Size of the page</param>
        /// <returns></returns>
        public PhonebookList[] ListEntries(int startIndex, int sizeOfPage)
        {
            if (startIndex < 0 || startIndex + sizeOfPage > this.dictionary.Count)
            {
                throw new ArgumentException("Invalid list parameters!");
            }

            PhonebookList[] listOfContacts = new PhonebookList[sizeOfPage];

            for (int index = startIndex; index <= startIndex + sizeOfPage - 1; index++)
            {
                PhonebookList entry = this.sortedPhonebookList[index];
                listOfContacts[index - startIndex] = entry;
            }

            return listOfContacts;
        }