/// <summary>
        /// Return existing words changing only one letter
        /// </summary>
        /// <param name="sOldString">Initial string</param>
        /// <returns></returns>
        private static List<string> GetNewStrings(string sWord, WordDictionary dicc)
        {
            List<string> listNewStrings = new List<string>();

            if (string.IsNullOrEmpty(sWord))
            {
                sWord = string.Empty;
            }

            if (dicc != null)
            {
                for (int i = 0; i < sWord.Length; i++)
                {
                    char letter = sWord.ToLower()[i];
                    for (char l = 'a'; l <= 'z'; l++)
                    {
                        if (l == sWord[i]) continue;

                        StringBuilder sNewWord = new StringBuilder(sWord);
                        sNewWord[i] = l;
                        if (dicc.Contains(sNewWord.ToString()))
                        {
                            listNewStrings.Add(sNewWord.ToString());
                        }
                    }
                }
            }

            return listNewStrings;
        }
        /// <summary>
        /// Get a list of words given a secuence of phone keyboards numbers
        /// </summary>
        /// <param name="listNumber"></param>
        /// <returns></returns>
        public static List<string> GetWords(List<int> listNumber)
        {
            List<string> listWords = new List<string>();

            // Validate input
            if (listNumber == null || listNumber.Count == 0)
            {
                throw new ArgumentNullException("listNumber", "List null or empty");
            }
            if (listNumber.Exists (p=> p < 2 || p > 9))
            {
                throw new ArgumentOutOfRangeException("listNumber", "Numbers must be in range 2 - 9");
            }

            // Initialize queue
            Queue<string> queue = new Queue<string>();
            foreach (string s in GetNewStrings(string.Empty, listNumber[0]))
            {
                queue.Enqueue(s);
            }

            // Generate possible words
            for (int i=1; i<listNumber.Count; i++)
            {
                while (queue.Count > 0 && queue.Peek().Count() <= i)
                {
                    foreach (string s in GetNewStrings(queue.Dequeue(), listNumber[i]))
                    {
                        queue.Enqueue(s);
                    }
                }
            }

            // Check possible words with a dictionary
            WordDictionary dicc = new WordDictionary();
            while (queue.Count > 0)
            {
                string sAux = queue.Dequeue();
                if (dicc.Contains(sAux))
                {
                    listWords.Add(sAux);
                }

                // Add all words generate
                // listWords.Add(queue.Dequeue());
            }
            return listWords;
        }