0

Я пытаюсь сделать вот что: взять текст, разбить его на слова, а потом получить пары "слово - кол-во его вхождений в текст". Решение хочу получить при помощи 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();
        }
    }
}

S.H.
  • 11,065
  • 1
  • 24
  • 46
  • 2
    IGrouping уже содержит все, что вам нужно. Можете в цикле у себя заменить var counter = allWorlds.Count(x => g.Key == x); на var counter = g.Count(); – tym32167 Jan 17 '21 at 17:15
  • @SmorcIRL Круто, большое спасибо! – S.H. Jan 17 '21 at 17:18

1 Answers1

3

Так?

var result = allWorlds.GroupBy(x => x).Select(x => new {Word = x.Key, Count = x.Count()});
SmorcIRL
  • 806