Содержание
Задача: дан массив целых чисел. Необходимо: 1) вывести на экран уникальные числа из массива и частоту с которой эти числа встречаются в массиве; 2) вывести N самых часто встречающихся в массиве чисел.
Задача достаточно легко может быть решена с использованием LINQ в C#. Рассмотрим её решение по каждому пункту в отдельности.
Вывести на экран уникальные числа из массива и частоту с которой эти числа встречаются
Пусть у нас есть массив:
int[] array = { 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 6, 6, 6, 6, 6, 1, 2, 3 };
Нам необходимо вывести на экран, что число 1 встречается в массиве 8 раз, число 2 — 2 раза, число 3 — 2 раза и так далее. Решить такую задачу с использованием LINQ не составляет никакого труда, используя возможности группировки последовательности, а, точнее метод GroupBy.
int[] array = { 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 6, 6, 6, 6, 6, 1, 2, 3 }; var mass = array.GroupBy(x => x);//группируем массив foreach (IGrouping<int, int> group in mass) Console.WriteLine($"Число {group.Key} встречается {group.Count()} раз");
Первое, что мы сделали — это сгруппировали весь наш массив, используя в качестве ключа само число из массива. Далее, в цикле foreach
прошлись по полученной выборке и для каждого её элемента определили размер группы, используя метод Count
. Результат работы программы будет следующим:
Число 2 встречается 2 раз
Число 3 встречается 2 раз
Число 4 встречается 2 раз
Число 5 встречается 2 раз
Число 6 встречается 7 раз
Число 7 встречается 1 раз
Число 8 встречается 1 раз
Вывести N самых часто встречающихся в массиве чисел
В данном случае, пользователь может задать в качестве N
любое число. Например, если пользователь задаст 2, то программа должна выдать, что число 1 встречается 8 раз, а число 6 — 7 раз, так как именно эти два числа имеют самую большую частоту в массиве. Решить такую задачу можно, отсортировав полученную на предыдущем шаге последовательность в порядке убывания частоты (метод OrderByDescending
) и выбрав N
элементов из отсортированной последовательности (метод Take
)
Console.WriteLine("Введите N"); int N = Convert.ToInt32(Console.ReadLine()); mass = mass.OrderByDescending(x => x.Count()).Take(N); foreach (IGrouping<int, int> group in mass) Console.WriteLine($"Число {group.Key} встречается {group.Count()} раз");
Исходный код программы
Ниже представлен весь исходный код лабораторной работы
internal class Program { /// <summary> /// Вывод последовательности на экран /// </summary> /// <param name="group"></param> static void Display(IEnumerable<IGrouping<int, int>> group) { foreach (IGrouping<int, int> element in group) Console.WriteLine($"Число {element.Key} встречается {element.Count()} раз"); } static void Main(string[] args) { //задаем исходный масссив int[] array = { 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 6, 6, 6, 6, 6, 1, 2, 3 }; //группируем массив по уникальным числам var mass = array.GroupBy(x => x); Display(mass); Console.WriteLine("Введите N"); int N = Convert.ToInt32(Console.ReadLine()); //сортируем по убыванию частоты и выбираем N элементов mass = mass.OrderByDescending(x => x.Count()).Take(N); Display(mass); } }
Итого
В этой лабораторной работе C# мы познакомились с использованием нескольких групп методов LINQ — методы группировки элементов последовательности, агрегатные операции LINQ и методы выбора и пропуска элементов LINQ.