Я пытаюсь сделать вот что: взять текст, разбить его на слова, а потом получить пары "слово - кол-во его вхождений в текст". Решение хочу получить при помощи LINQ.
Я делаю группировку, и после этого прекрасно получаю в цикле по ключу группировки counter - кол-во вхождений слова.
Но хотелось бы сделать это без цикла, чтобы 1) использовать "ленивым" образом 2) можно было сделать дальнейшие преобразования, нпаример, сорттировку по частоте
Но вот как сделать "трансформацию" в терминах LINQ - не могу понять... Не подскажете ли вы мне? Спасибо.
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace Linq06 {
class Program {
static void Main(string[] args) {
StreamReader sr = new StreamReader("Text.txt", Encoding.GetEncoding(1251));
string str = sr.ReadToEnd();
MatchCollection wcoll = Regex.Matches(str, @"[а-я]\w*", RegexOptions.IgnoreCase);
// Получим коллекцию слов
var allWorlds = wcoll.Cast<Match>().Select(w => w.ToString());
var grp = allWorlds.GroupBy(x => x);
foreach (IGrouping<string, string> g in grp) {
var counter = allWorlds.Count(x => g.Key == x);
}
Console.ReadKey();
}
}
}
IGroupingуже содержит все, что вам нужно. Можете в цикле у себя заменитьvar counter = allWorlds.Count(x => g.Key == x);наvar counter = g.Count();– tym32167 Jan 17 '21 at 17:15