C# Заменить повторяющиеся слова их количеством

172
10 июля 2018, 09:30

Есть текст -

cat cat cat cat cat cat cat cat cat cat dog dog dog dog dog

Я делаю из текста массив строк с помощью Text.Split(' '). Как потом пользуясь циклом foreach получить такой текст? -

cat_10 dog_5

Если слово встречается один раз подряд - нужно делать cat_1

Answer 1

Ну, можно попробовать так:

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);
  1. Разбиваем через Split.
  2. Группируем по значению.
  3. Преобразуем в коллекцию IEnumerable<string>, где каждое значение будет вида Key_count.
  4. С помощью 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
Answer 2

При помощи регулярки:

string text = "wolf cat cat cat cat cat cat cat cat cat cat dog dog dog dog dog";
Regex r = new Regex(@"((\w+)( \2)*)");
string result = r.Replace(text, m => m.Groups[2].Value + "_" + m.Value.Split().Length);

Результат:

wolf_1 cat_10 dog_5
READ ALSO
Подключение к MySql asp.net

Подключение к MySql asp.net

Не могу подключиться к базе (локальной)Ошибка:

159
Подзапрос к Dictionary, Linq. Получить Max по Value, и Min по Key

Подзапрос к Dictionary, Linq. Получить Max по Value, и Min по Key

У меня спортивный интерес, как сделать следующий запрос более лаконичнымИ вообще понять как осуществляются подзапросы в linq к такой коллекции...

138
Авторизация .Net

Авторизация .Net

У меня возник следущий вопрос: у IdentityServer4 есть AddSigningCredential, который можно использовать для добавления сертификата, который, в свою очередь,...

175
C# Внесение изменений в xml файл из txt файла

C# Внесение изменений в xml файл из txt файла

Есть два файла: Файл txt(файл источник), в котором 4 колонки и несколько строк

189