Избавление от String.Split
не оставляет много вариантов на столе.Один вариант - Regex.Matches
, как показал Спендер , а другой - Regex.Split
(что не дает нам ничего нового).
Вместо группировки вы можете использовать любой из этих подходов:
var target = src.Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
var result = target.Distinct()
.Select(s => new { Word = s, Count = target.Count(w => w == s) });
// or dictionary approach
var result = target.Distinct()
.ToDictionary(s => s, s => target.Count(w => w == s));
Вызов Distinct
необходим, чтобы избежать дублирования элементов.Я пошел дальше и расширил символы, чтобы разделить их, чтобы получить настоящие слова без знаков препинания.Я обнаружил, что первый подход является самым быстрым с использованием кода тестирования Spender.
Возвращаясь к требованию упорядочить результаты из вашего ранее упомянутого вопроса, вы можете легко расширить первый подход следующим образом:
var result = target.Distinct()
.Select(s => new { Word = s, Count = target.Count(w => w == s) })
.OrderByDescending(o => o.Count);
// or in query form
var result = from s in target.Distinct()
let count = target.Count(w => w == s)
orderby count descending
select new { Word = s, Count = count };
РЕДАКТИРОВАТЬ: избавился от кортежа, так как анонимный тип был под рукой.