Məzmuna keç
Educora
İrəli19 dəq9 / 16

LINQ: verilənləri sorğulamaq

Lambda ifadələri və LINQ metodları ilə kolleksiyaları filtrlə, çevir, sırala və topla: `Where`, `Select`, `OrderBy`, `Sum`, `Average`, `GroupBy`.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • Lambda ifadəsini (x => ...) oxumaq və yazmaq
  • Where, Select və OrderBy ilə kolleksiyanı filtrləmək, çevirmək və sıralamaq
  • Sum, Average, Count, Any və GroupBy ilə nəticələri toplamaq
  • Təxirə salınmış icranı və ToList()-in rolunu izah etmək

Sinfin qiymətləri siyahısında 80-dən yuxarı bal toplayanları tapmaq, onları azalan sıra ilə düzmək və yalnız adlarını götürmək lazımdır. Dövrlərlə bu, yeni siyahılar, if-lər və sıralama kodu deməkdir. LINQ (Language Integrated Query — dilə daxil edilmiş sorğu) ilə isə eyni iş bir neçə oxunaqlı sətirdə görülür, sanki kompüterə sadəcə nə istədiyini deyirsən.

Lambda ifadələri

Tərif
Lambda ifadəsi

Adsız qısa funksiya: oxdan (=>) solda parametr, sağda nəticə yazılır. n => n * 2 «n-i al, n · 2 qaytar» deməkdir, s => s.Score >= 80 isə «şagirdin balı 80 və ya çoxdurmu?» sualına true/false cavabı verir.

LINQ metodları istənilən kolleksiya ilə işləyir — massiv, List<T>, lüğət — və arqument kimi lambda qəbul edir. Onlar orijinal kolleksiyanı dəyişmir, yeni nəticə qaytarır. Aşağıdakı nümunədə Where şərtə uyğun elementləri seçir, Select hər elementi çevirir, OrderBy isə sıralayır.

C#
int[] numbers = [5, 12, 8, 3, 20, 7];

var evens = numbers.Where(n => n % 2 == 0);
var doubled = numbers.Select(n => n * 2);
var sorted = numbers.OrderBy(n => n);

Console.WriteLine(string.Join(", ", evens));
Console.WriteLine(string.Join(", ", doubled));
Console.WriteLine(string.Join(", ", sorted));
Console.WriteLine($"Sum: {numbers.Sum()}, max: {numbers.Max()}");
Console.WriteLine($"Greater than 6: {numbers.Count(n => n > 6)}");
Gözlənilən nəticə
12, 8, 20
10, 24, 16, 6, 40, 14
3, 5, 7, 8, 12, 20
Sum: 55, max: 20
Greater than 6: 4

Metodları zəncirləmək

Hər LINQ metodu yeni ardıcıllıq qaytardığı üçün növbəti metodu dərhal onun üzərində çağırmaq olar. Belə zəncir yuxarıdan aşağıya bir cümlə kimi oxunur: «80 və daha çox bal alanları seç, bala görə azalan sıra ilə düz, adlarını götür». Zənciri adətən hər metod ayrı sətirdə olmaqla yazırlar.

C#
using System.Globalization;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

List<Student> students =
[
    new("Aysel", 95), new("Murad", 78), new("Leyla", 88),
    new("Elvin", 45), new("Nigar", 91)
];

var topNames = students
    .Where(s => s.Score >= 80)
    .OrderByDescending(s => s.Score)
    .Select(s => s.Name);
Console.WriteLine(string.Join(", ", topNames));

Console.WriteLine($"Average: {students.Average(s => s.Score):F1}");
Console.WriteLine($"Everyone passed: {students.All(s => s.Score >= 50)}");
Console.WriteLine($"Anyone above 90: {students.Any(s => s.Score > 90)}");
Console.WriteLine($"Best: {students.OrderByDescending(s => s.Score).First().Name}");

record Student(string Name, int Score);
Gözlənilən nəticə
Aysel, Nigar, Leyla
Average: 79.4
Everyone passed: False
Anyone above 90: True
Best: Aysel
MetodNə edir
Where(x => ...)şərtə uyğun elementləri seçir
Select(x => ...)hər elementi başqa qiymətə çevirir
OrderBy / OrderByDescendingartan / azalan sıra ilə düzür
Sum, Average, Min, Max, Countcəm, orta, ən kiçik, ən böyük, say
First / FirstOrDefaultilk elementi verir; boşdursa xəta / null
Any / Allheç olmasa biri / hamısı şərtə uyğundurmu
GroupBy(x => ...)elementləri açara görə qruplaşdırır
ToList()nəticəni hazır siyahıya çevirir

Qruplaşdırma

GroupBy elementləri ümumi açara görə qruplara bölür: məsələn, məhsulları kateqoriyaya görə. Hər qrupun Key xassəsi (açar) var və qrupun özü də kolleksiyadır, ona görə onun üzərində Count və Sum çağırmaq olar. FirstOrDefault isə uyğun element tapılmayanda xəta atmır, null qaytarır.

C#
List<Product> products =
[
    new("Laptop", "Electronics", 1500),
    new("Pen", "Stationery", 2),
    new("Phone", "Electronics", 900),
    new("Notebook", "Stationery", 5),
    new("Mouse", "Accessories", 25)
];

var groups = products
    .GroupBy(p => p.Category)
    .OrderBy(g => g.Key);

foreach (var g in groups)
    Console.WriteLine($"{g.Key}: {g.Count()} item(s), total {g.Sum(p => p.Price)} AZN");

Product? cheap = products.FirstOrDefault(p => p.Price < 1);
Console.WriteLine(cheap is null ? "No product under 1 AZN" : cheap.Name);

record Product(string Name, string Category, decimal Price);
Gözlənilən nəticə
Accessories: 1 item(s), total 25 AZN
Electronics: 2 item(s), total 2400 AZN
Stationery: 2 item(s), total 7 AZN
No product under 1 AZN
Product? tipindəki sual işarəsi dəyişənin null ola biləcəyini bildirir.
İnteraktiv
Simulyasiya yüklənir…
OrderBy səni sıralama alqoritmi yazmaqdan azad edir. Burada sadə alqoritmlərdən birinin addım-addım necə işlədiyinə bax.

Təxirə salınmış icra

Where və Select çağırılanda heç nə hesablanmır — yalnız «resept» yadda saxlanılır. Sorğu nəticəni həqiqətən istəyəndə icra olunur: foreach-də, string.Join-da və ya Sum kimi metodlarda. Buna təxirə salınmış icra deyilir. Nəticəni həmin an «dondurmaq» üçün ToList() çağır.

C#
List<int> scores = [50, 70, 90];

var high = scores.Where(s => s > 60);
var snapshot = scores.Where(s => s > 60).ToList();

scores.Add(100);

Console.WriteLine(string.Join(", ", high));
Console.WriteLine(string.Join(", ", snapshot));
Gözlənilən nəticə
70, 90, 100
70, 90
high sorğusu 100 əlavə olunandan sonra icra olundu, snapshot isə əvvəlcədən hazırlanmışdı.

Əsas fikirlər

  • Lambda — adsız qısa funksiyadır: n => n * 2.
  • Where filtrləyir, Select çevirir, OrderBy/OrderByDescending sıralayır.
  • Sum, Average, Max, Count, Any, All bütün kolleksiyadan bir cavab çıxarır.
  • LINQ orijinal kolleksiyanı dəyişmir; metodları zəncir kimi birləşdirmək olar.
  • Sorğu nəticə istənəndə icra olunur; ToList() nəticəni dərhal hazırlayır.

Özünü yoxla

10 sual. Hər düzgün cavab XP qazandırır.

1 / 10
int[] a = [1, 2, 3, 4]; olarsa, a.Where(n => n > 2).Sum() nəyə bərabərdir?