using System; using System.Linq; public class Test { public static void Main() { var str = "HELLOWHELOLWHАРОЗАУПАЛАНАЛАПУАЗОРА"; var wordLen = 3; var xxx=Enumerable.Range(0, (int)Math.Ceiling((decimal)str.Length / wordLen)) // Получим число слов .Select(i => str.Substring(i * wordLen, Math.Min(str.Length-i*wordLen,wordLen)).ToCharArray())// Разобьём строку на части нужной длины (последнее слово - остатком) .SelectMany(x => x.Select((c,i) => new { index = i, chr = c }))// Разобьём части на символы с запоминанием позиции .GroupBy(x => x.index) // Сгруппируем в "слова" .Select((x, i) => new { Word = i, letters = x.GroupBy(g => g.chr) }) //Сгруппируем каждое слово посимвольно .Select(x => x.letters.Select(l => new { x.Word, l.Key, Count = l.Count() })) //Посчитаем символы .SelectMany(x => Enumerable.Range('A', 'Z'-'A').Union(Enumerable.Range('А', 'Я'-'А')).Select(e => new //Получим алфавит { x.First().Word, Letter = (char)e, Rate = (decimal)(x.FirstOrDefault(w => w.Key == e)?.Count??0) / x.Sum(w => w.Count) //Посчитаем рейт })).Where(x=>x.Rate>0).ToList(); //Выведем все записи с ненулевым рейтом foreach(var x in xxx) { Console.WriteLine($"Word: {x.Word}, Letter: {x.Letter}, Rate: {x.Rate}"); } } }