CodeGym /Kurslar /C# SELF /Elementlərin filtrasiya olunması

Elementlərin filtrasiya olunması

C# SELF
Səviyyə , Dərs
Mövcuddur

1. Kolleksiyaların filtrasiya olunmasının əsas yolları

Filtrasiya — bu elə bil qızıl üçün ələk kimidir, sadəcə burada biz kolleksiyadan bizə lazım olan elementləri seçirik. Məsələn, bizdə istifadəçilər siyahısı var — tutaq ki, yalnız yetkinləri tapmaq istəyirik, ya da yalnız tələbələri, ya da yalnız kofe sevənləri (yəni proqramçıları). Uyğun elementləri seçmək — çox tez-tez rast gəlinən tapşırıqdır, hər yerdə olur: DB ilə işləməkdən tutmuş istifadəçi daxilini emal etməyə qədər.

Gəlin C#-da filtrasiya üçün müxtəlif yolları nəzərdən keçirək. Öyrəndikcə bizim tədris konsol tətbiqimizi inkişaf etdirəcəyik, ora filtrlər əlavə edəcəyik.

Dövr ilə əl filtrasiya

Ən sadə və klassik üsuldan başlayaq: foreach ilə filtrasiya:


// Nümunə: siyahıda ədədlər var, yalnız cüt olanları seçmək lazımdır

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
List<int> evenNumbers = new List<int>();

foreach (int number in numbers)
{
    if (number % 2 == 0) // əgər ədəd cütdürsə
    {
        evenNumbers.Add(number);
    }
}

Console.WriteLine("Cüt ədədlər:");
foreach (int n in evenNumbers)
{
    Console.WriteLine(n);
}

Bu üsul həmişə işləyir, başa düşmək asandır, amma ən yığcam və ən "müasir" deyil.

Niyə əl filtrasiya həmişə rahat olmur?

Əgər səndə başqa kolleksiya, başqa filtrasiya kriteriyası varsa, ya da bir neçə filtr yazmaq lazımdırsa — çox oxşar kod alınacaq. İstəyirsən ki, kod yığcam, oxunaqlı və modullu olsun.

2. Mürəkkəb kriteriyalar üzrə filtrasiya

Tutaq ki, bizdə obyektlər kolleksiyası var. Bizim inkişaf etdirdiyimiz tətbiqdən istifadəçi nümunəsini götürək.


public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsStudent { get; set; }
}

İstifadəçilər siyahısını elan edirik:


List<User> users = new List<User>
{
    new User { Name = "Anya", Age = 17, IsStudent = true },
    new User { Name = "Boris", Age = 21, IsStudent = false },
    new User { Name = "Vika", Age = 19, IsStudent = true },
    new User { Name = "Gleb", Age = 25, IsStudent = false }
};

Nümunə 1: Bütün tələbələri seçmək


List<User> students = new List<User>();
foreach (User user in users)
{
    if (user.IsStudent)
        students.Add(user);
}

Console.WriteLine("Tələbələr siyahısı:");
foreach (User user in students)
{
    Console.WriteLine($"{user.Name} ({user.Age})");
}

Nümunə 2: Yalnız yetkin tələbələri seçmək


List<User> adults = new List<User>();
foreach (User user in users)
{
    if (user.Age >= 18 && user.IsStudent)
        adults.Add(user);
}

Console.WriteLine("Yetkin tələbələr:");
foreach (User user in adults)
{
    Console.WriteLine($"{user.Name} ({user.Age})");
}

Bəs əgər filtrasiya kriteriyaları dinamikdirsə?

Filtrasiya şərtlərini ayrıca metodlara çıxarmaq olar ki, dövrün içində onları çağırasan:


bool IsAdult(User u) { return u.Age >= 18; }
bool IsStudent(User u) { return u.IsStudent; }

List<User> filtered = new List<User>();
foreach (User user in users)
{
    if (IsAdult(user) && IsStudent(user))
        filtered.Add(user);
}

3. Dictionary-də açara görə filtrasiya

Siyahılar və massivlər rahatdır, amma çox vaxt biz dictionary-lərlə də işləyirik.

Tutaq ki, bizdə dictionary var, burada açar — istifadəçi adı, dəyər isə onun yaşıdır:


Dictionary<string, int> ageByName = new Dictionary<string, int>
{
    ["Anya"] = 17,
    ["Boris"] = 21,
    ["Vika"] = 19,
    ["Gleb"] = 25
};

Tapşırıq: yalnız 18+ istifadəçiləri seçmək


Dictionary<string, int> adults = new Dictionary<string, int>();
foreach (var pair in ageByName)
{
    if (pair.Value >= 18)
        adults.Add(pair.Key, pair.Value);
}

Console.WriteLine("Yetkinlər:");
foreach (var pair in adults)
{
    Console.WriteLine($"{pair.Key}: {pair.Value} yaş");
}

Tapşırıq: adı "V" hərfi ilə başlayan istifadəçiləri seçmək


Dictionary<string, int> namesWithV = new Dictionary<string, int>();
foreach (var pair in ageByName)
{
    if (pair.Key.StartsWith("V"))
        namesWithV.Add(pair.Key, pair.Value);
}

Console.WriteLine("'V' hərfi ilə başlayan adlar:");
foreach (var pair in namesWithV)
{
    Console.WriteLine($"{pair.Key}: {pair.Value} yaş");
}

4. Filtrasiya prinsipləri

Filtrasiya prosesi necə işləyir


┌──────────────────────────────────┐
│  Siyahı: [1, 2, 3, 4, 5, 6]      │
└──────────────────────────────────┘
         │
         ▼
    [Yoxlama: n % 2 == 0]
         │
         ▼
┌──────────────────────────────────┐
│  Nəticə: [2, 4, 6]               │
└──────────────────────────────────┘

Filtrlərin kompozisiyası: müxtəlif şərtlərlə filtrasiya

Məlumatları mərhələli şəkildə seçmək istəyirsənsə, ardıcıl filtrasiya edə bilərsən:


// Əvvəlcə yalnız tələbələri filtrləyirik
List<User> onlyStudents = new List<User>();
foreach (User user in users)
{
    if (user.IsStudent)
        onlyStudents.Add(user);
}

// Sonra onların içindən yalnız yetkinləri seçirik
List<User> adultStudents = new List<User>();
foreach (User user in onlyStudents)
{
    if (user.Age >= 18)
        adultStudents.Add(user);
}

Və ya hamısını bir yerdə:


List<User> adultStudents = new List<User>();
foreach (User user in users)
{
    if (user.IsStudent && user.Age >= 18)
        adultStudents.Add(user);
}

Sıralama və digər əməliyyatlar

Siyahılar üçün Sort metodu ilə sıralama etmək olar:


// Yaşına görə sıralanmış yetkin tələbələr
adultStudents.Sort((a, b) => a.Age.CompareTo(b.Age));

Sıralama haqqında daha ətraflı növbəti mühazirədə danışacağıq!

5. İstifadəçi ssenarilərində filtrasiya

1. İstifadəçi daxilinin filtrasiyası

Tutaq ki, bizim tətbiq siyahı şəklində qiymətlər qəbul edir və bütün "beş"ləri seçməlidir.


Console.Write("Qiymətləri boşluqla yazın: ");
string input = Console.ReadLine();

List<int> grades = new List<int>();
foreach (string s in input.Split(' '))
{
    if (int.TryParse(s, out int grade))
        grades.Add(grade);
}

List<int> fives = new List<int>();
foreach (int grade in grades)
{
    if (grade == 5)
        fives.Add(grade);
}

Console.WriteLine("Beşlər:");
foreach (var grade in fives)
{
    Console.WriteLine(grade);
}

2. Bir neçə şərtə görə filtrasiya

Tapşırıq: 18-dən 22-yə qədər (daxil olmaqla) yaşda olan tələbə istifadəçiləri seçmək.


List<User> filtered = new List<User>();
foreach (User user in users)
{
    if (user.IsStudent && user.Age >= 18 && user.Age <= 22)
        filtered.Add(user);
}

3. Elementin olub-olmamasına görə filtrasiya

Tutaq ki, bizdə string-lər siyahısı var və yalnız ".net" alt sətrini (case-ə baxmadan) saxlayanları seçmək istəyirik.


List<string> technologies = new List<string> { "C#", ".NET", "Java", "dotnet", "JavaScript" };

List<string> netTechs = new List<string>();
foreach (var tech in technologies)
{
    if (tech.ToLower().Contains(".net"))
        netTechs.Add(tech);
}

foreach (var tech in netTechs)
{
    Console.WriteLine(tech);
}

6. Filtrasiya zamanı xüsusiyyətlər və tipik səhvlər

Filtrasiya asan görünür, amma burada səhv etmək olar. Gəlin bəzi xüsusiyyətləri nəzərdən keçirək.

Əsas kolleksiyanın dəyişdirilməsi

Əgər sən əsas kolleksiyanı filtrləyirsənsə və sonra filtrasiyadan sonra onu dəyişirsənsə, — nəticə dəyişməyəcək, əgər artıq yeni siyahı yaratmısansa. Amma sadəcə köhnə siyahıya istinad saxlamısansa, əsas kolleksiyadakı dəyişikliklər nəticəyə təsir edə bilər.


List<int> filtered = new List<int>();
foreach (int n in numbers)
{
    if (n > 2)
        filtered.Add(n);
}

// Əsas siyahıya dəyişiklik edirik
numbers.Add(10);

foreach (var n in filtered)
{
    Console.WriteLine(n); // 10 bura düşməyəcək
}

Əl filtrasiya nəticəsi

Əl filtrasiyasının nəticəsi adətən yeni dəyişən siyahıdır (məsələn, List<T>), onunla istədiyini edə bilərsən — element əlavə et, sil və s.

Filtrasiya və performans

Dövr içində filtrlər kolleksiyadakı hər element üçün çağırılır, ona görə də əgər şərtin içindəki funksiya ağırdırsa — ehtiyatlı ol. Bəzən sadə foreach dövrü yazmaq daha rahatdır, xüsusən də mürəkkəb məntiq, loglama və ya əlavə əməliyyatlar lazımdırsa.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION