Содержание
Задача: дан массив целых чисел. Необходимо: 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.