Лабораторная работа по C#. Определить частоту чисел в массиве (LINQ)

Задача: дан массив целых чисел. Необходимо: 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. Результат работы программы будет следующим:

Число 1 встречается 8 раз
Число 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.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии