C# Contar palabras de un texto

Un ejercicio común en los estudios o incluso en una entrevista de trabajo es pedirte que hagas una función que cuente las palabras de un texto y las muestre por pantalla.

El ejercicio en sí no es demasiado difícil y hay bastantes formas diferentes de hacerlo, una de ellas puede ser utilizar la función «.Split» para que nos separe las palabras del texto, una vez hecho esto debemos almacenar la palabra en un diccionario o en un array junto con la cantidad de veces que aparece en el texto.

Con cada elemento del resultado del Split debemos comprobar si existe en nuestro diccionario. En caso de que no exista lo agregamos como Key con valor 1 y si existe le sumamos uno al valor de la palabra.

Por último, solo nos quedaría mostrarlo por pantalla y listo, ejercicio resuelto.

Código fuente para contar palabras en C#

He preparado un código fuente muy sencillo que cuenta las palabras y las muestra en una aplicación de consola.

static void Main(string[] args)
        {
            var text = GetText();

            //Eliminar el texto símbolos y demás que no nos interesen.
            string cleanText = text.ToLower().Replace(",", "").Replace(".", "").Replace(";", "").Replace("¿", "").Replace("?", "");

            Dictionary<string, int> wordsCount = new();

            //Separamos el texto por espacios, saltos de linea. El StringSplitOptions.RemoveEmptyEntries sirve para que no se guarden entradas vacias en el array
            var arrText = cleanText.Split(
                " ",               
                StringSplitOptions.RemoveEmptyEntries
                );

            foreach (var word in arrText)
            {
                string wordLower = word.ToLower();

                //Comprobamos si la palabra ya existe en el diccionario.
                if (wordsCount.ContainsKey(wordLower))
                {
                    //Si existe le sumamos una repetición más.
                    wordsCount[wordLower] = wordsCount[wordLower] + 1;
                }
                else
                {
                    //Si no, la agregamos al diccionario con valor 1. 
                    wordsCount.Add(wordLower, 1);
                }
            }

            //Ordenamos el diccionario de mayor a menor
            var sortedDict = wordsCount.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

            //Mostramos las palabras por consola con sus repeticiones
            foreach (var word in sortedDict)
            {
                Console.WriteLine($"{word.Key} tiene {word.Value} repeticiones");
            }
        }

static string GetText()
        {
            string text = @"Hola Hola Hola, Soy un un texto cualquiera...";

            return text;
        }

Si te fijas en el código algunos símbolos para que no nos cuente como palabras diferentes en caso de que tengan algún símbolo y aparte le paso el parámetro StringSplitOptions.RemoveEmptyEntries para que no nos guarde valores en blanco en el Split.

El código puede mejorarse añadiendo eliminando más símbolos, quitando los tildes a las palabras y añadiendo que el Split también tenga en cuenta saltos de línea, pero para que te hagas una idea ya te sirve.

Cómo he comentado es un código fuente mejorable. ¿Por qué no me pones en los comentarios cómo lo mejorarías?

Deja un comentario