Ну, можно попробовать так:
string text = "cat cat cat cat cat cat cat cat cat cat dog dog dog dog dog";
var result = text.Split().GroupBy(x => x).Select(group=> $"{group.Key}_{group.Count()}");
var resultString = string.Join(" ", result);
- Разбиваем через Split.
- Группируем по значению.
- Преобразуем в коллекцию
IEnumerable<string>, где каждое значение будет вида Key_count.
- С помощью
string.Join преобразуем коллекцию в строку.
* Этот пункт можно вовсе заменить, путем добавления после select() что то вроде .Aggregate((current, next) => current + " " + next). Тогда вы сразу будете получать нужную вам строку.
Если вам по какой либо причине не хочется использовать LINQ и все новые навороты C#, то делайте тогда что то по типу следующего:
string text = "cat cat cat cat cat cat cat cat cat cat dog dog dog dog dog";
string[] arr = text.Split();
string result = "";
foreach (var val in arr)
{
if (!result.Contains(val))
{
int count = 0;
for (var i = 0; i < arr.Length; i++)
{
if (arr[i] == val)
count++;
}
result += val + "_" + count + " ";
}
}
Для скорости можно использовать StringBuilder, а все циклы на for.
Результат:
cat_10 dog_5