9-bo‘lim

Kolleksiyalar

List(Of T) bilan o'zgaruvchan ro'yxat, Dictionary kalit-qiymat juftliklari, HashSet, Queue va Stack, hamda tartib kafolati haqida.

🕑 12 daqiqa o‘qish 📄 514 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. List(Of T)
  2. From bilan to'ldirish
  3. Ro'yxat bo'ylab yurish
  4. Dictionary - kalit va qiymat
  5. Mavjud bo'lmagan kalit
  6. Tartib kafolatlanmagan
  7. HashSet - takrorlanmas to'plam
  8. Queue va Stack
  9. Qaysi birini tanlash
  10. Xulosa

Massiv o'lchami qat'iy. Haqiqiy dasturlarda esa element qo'shish va o'chirish kerak bo'ladi - buning uchun kolleksiyalar bor.

List(Of T) #

VB
Module Dastur
    Sub Main()
        Dim shaharlar As New List(Of String)

        shaharlar.Add("Namangan")
        shaharlar.Add("Andijon")
        shaharlar.Add("Farg'ona")

        Console.WriteLine(shaharlar.Count)
        Console.WriteLine(shaharlar(0))
        Console.WriteLine(String.Join(", ", shaharlar))
    End Sub
End Module
Natija
3
Namangan
Namangan, Andijon, Farg'ona

New List(Of String) bo'sh ro'yxat yaratadi, Add esa unga element qo'shadi. Massivdan farqli o'laroq, o'lchamni oldindan aytish shart emas.

Endi o'chirish va qo'shishni ko'ramiz:

VB
Module Dastur
    Sub Main()
        Dim shaharlar As New List(Of String) From {
            "Namangan", "Andijon", "Farg'ona"
        }

        Console.WriteLine(String.Join(", ", shaharlar))

        shaharlar.Remove("Andijon")
        Console.WriteLine(String.Join(", ", shaharlar))

        shaharlar.Insert(1, "Qo'qon")
        Console.WriteLine(String.Join(", ", shaharlar))

        Console.WriteLine(shaharlar.Contains("Namangan"))
        Console.WriteLine(shaharlar.IndexOf("Qo'qon"))
    End Sub
End Module
Natija
Namangan, Andijon, Farg'ona
Namangan, Farg'ona
Namangan, Qo'qon, Farg'ona
True
1
MetodNima qiladi
AddOxiriga qo'shadi
Insert(i, x)Ko'rsatilgan joyga qo'yadi
Remove(x)Qiymat bo'yicha o'chiradi
RemoveAt(i)Indeks bo'yicha o'chiradi
CountElementlar soni
ContainsBormi
ClearHammasini o'chiradi
Count va Length farqi

Massivda Length, kolleksiyada Count ishlatiladi.

Sababi tarixiy, lekin qoida oddiy: qavsli e'lon qilingan massivda - Length, List va boshqa kolleksiyalarda - Count.

From bilan to'ldirish #

VB
Module Dastur
    Sub Main()
        Dim ballar As New List(Of Integer) From {85, 92, 78, 95}

        ballar.Sort()
        Console.WriteLine(String.Join(", ", ballar))

        Console.WriteLine(ballar.Sum())
        Console.WriteLine(ballar.Average())
        Console.WriteLine(ballar.Max())
    End Sub
End Module
Natija
78, 85, 92, 95
350
87.5
95

Ro'yxat bo'ylab yurish #

VB
Module Dastur
    Sub Main()
        Dim talabalar As New List(Of String) From {
            "Malika", "Aziza", "Kamola"
        }

        For Each talaba As String In talabalar
            Console.WriteLine($"- {talaba}")
        Next

        For i As Integer = 0 To talabalar.Count - 1
            Console.WriteLine($"{i + 1}. {talabalar(i)}")
        Next
    End Sub
End Module
Natija
- Malika
- Aziza
- Kamola
1. Malika
2. Aziza
3. Kamola
Sikl ichida o'chirmang

For Each bajarilayotganda ro'yxatni o'zgartirish xatoga olib keladi:

VB
For Each x In royxat
    royxat.Remove(x)    ' InvalidOperationException
Next

To'g'ri yo'llari:

  • Teskari tartibda indeks bilan yurish: For i = royxat.Count - 1 To 0 Step -1
  • Yoki royxat.RemoveAll(Function(x) shart) ishlatish.
VB
Module Dastur
    Sub Main()
        Dim sonlar As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8}

        sonlar.RemoveAll(Function(x) x Mod 2 = 0)
        Console.WriteLine(String.Join(", ", sonlar))
    End Sub
End Module
Natija
1, 3, 5, 7

Dictionary - kalit va qiymat #

VB
Module Dastur
    Sub Main()
        Dim poytaxtlar As New Dictionary(Of String, String)

        poytaxtlar.Add("O'zbekiston", "Toshkent")
        poytaxtlar.Add("Qozog'iston", "Ostona")
        poytaxtlar("Qirg'iziston") = "Bishkek"

        Console.WriteLine(poytaxtlar("O'zbekiston"))
        Console.WriteLine(poytaxtlar.Count)
        Console.WriteLine(poytaxtlar.ContainsKey("Tojikiston"))
    End Sub
End Module
Natija
Toshkent
3
False

Mavjud bo'lmagan kalit #

VB
Module Dastur
    Sub Main()
        Dim narxlar As New Dictionary(Of String, Integer) From {
            {"olma", 12000},
            {"anor", 18000}
        }

        Dim narx As Integer
        If narxlar.TryGetValue("anor", narx) Then
            Console.WriteLine($"Anor narxi: {narx}")
        End If

        If Not narxlar.TryGetValue("banan", narx) Then
            Console.WriteLine("Banan ro'yxatda yo'q")
        End If
    End Sub
End Module
Natija
Anor narxi: 18000
Banan ro'yxatda yo'q
Mavjud bo'lmagan kalit dasturni to'xtatadi

narxlar("banan") deb yozsangiz va bunday kalit bo'lmasa, KeyNotFoundException chiqadi.

Shuning uchun kalit borligiga ishonchingiz komil bo'lmasa, TryGetValue yoki ContainsKey ishlating.

Add ham shunday: mavjud kalitni qayta qo'shsangiz xato chiqadi. narxlar(kalit) = qiymat esa xato bermaydi - bori ustiga yozadi.

Tartib kafolatlanmagan #

VB
Module Dastur
    Sub Main()
        Dim yoshlar As New Dictionary(Of String, Integer) From {
            {"Malika", 22}, {"Husanboy", 25}, {"Aziza", 20}
        }

        For Each juft In yoshlar.OrderBy(Function(x) x.Key)
            Console.WriteLine($"{juft.Key}: {juft.Value}")
        Next
    End Sub
End Module
Natija
Aziza: 20
Husanboy: 25
Malika: 22
Dictionary tartibiga ishonmang

Dictionary elementlarni hech qanday tartibda saqlamaydi. Bugun qo'shilgan tartibda chiqishi mumkin, ertaga - yo'q.

Bu .NET ning ichki ishlash tafsiloti va u versiyadan versiyaga o'zgarishi mumkin.

Shuning uchun yuqoridagi misolda OrderBy ishlatilgan. Tartib muhim bo'lsa - har doim aniq saralang. Doimiy tartib kerak bo'lsa, SortedDictionary ham bor.

HashSet - takrorlanmas to'plam #

VB
Module Dastur
    Sub Main()
        Dim harflar As New HashSet(Of String)

        Console.WriteLine(harflar.Add("a"))
        Console.WriteLine(harflar.Add("b"))
        Console.WriteLine(harflar.Add("a"))
        Console.WriteLine(harflar.Count)

        Dim sonlar As New List(Of Integer) From {1, 2, 2, 3, 3, 3, 4}
        Dim noyob As New HashSet(Of Integer)(sonlar)
        Console.WriteLine(noyob.Count)
    End Sub
End Module
Natija
True
True
False
2
4

Add metodi Boolean qaytaradi: False - bu element allaqachon bor edi. Takrorlarni olib tashlashning eng tez usuli shu.

Queue va Stack #

VB
Module Dastur
    Sub Main()
        Dim navbat As New Queue(Of String)
        navbat.Enqueue("birinchi")
        navbat.Enqueue("ikkinchi")
        navbat.Enqueue("uchinchi")

        Console.WriteLine(navbat.Dequeue())
        Console.WriteLine(navbat.Dequeue())

        Dim stek As New Stack(Of String)
        stek.Push("birinchi")
        stek.Push("ikkinchi")
        stek.Push("uchinchi")

        Console.WriteLine(stek.Pop())
        Console.WriteLine(stek.Pop())
    End Sub
End Module
Natija
birinchi
ikkinchi
uchinchi
ikkinchi
TuzilmaQoidaHayotdagi misol
QueueBirinchi kirgan birinchi chiqadiKassadagi navbat
StackOxirgi kirgan birinchi chiqadiUstma-ust qo'yilgan tarelkalar

Qaysi birini tanlash #

Qaysi kolleksiyani tanlash kerak List(Of T) tartibli ro'yxat takror bo'lishi mumkin Dictionary kalit orqali qidirish tartib yo'q HashSet takrorlanmasligi kerak juda tez qidiradi Queue / Stack navbat yoki stek tartib qoidasi bor Shubhalansangiz - List(Of T) dan boshlang. Kalit bo'yicha qidirish kerak bo'lsa - Dictionary. Massiv esa faqat o'lcham hech qachon o'zgarmasa kerak bo'ladi
Aksariyat vazifalar uchun List va Dictionary yetarli
Amaliy topshiriq
  1. Beshta talaba ismini List(Of String) ga qo'shing.
  2. Ro'yxatdan bittasini Remove bilan o'chiring.
  3. Insert bilan ro'yxat o'rtasiga yangi ism qo'ying.
  4. Sonlar ro'yxatidan juftlarini RemoveAll bilan olib tashlang.
  5. Mahsulot-narx juftliklaridan Dictionary yasang.
  6. Mavjud bo'lmagan kalitni TryGetValue bilan xavfsiz so'rang.
  7. Dictionary ni kalit bo'yicha saralab chiqaring.
  8. Takrorlangan sonlar ro'yxatidan HashSet bilan noyoblarini oling.
  9. Queue bilan uchta vazifani navbatga qo'yib, bajaring.
  10. Stack bilan so'zni teskari o'qing.

Xulosa #

  • List(Of T) - o'lchami o'zgaradigan tartibli ro'yxat; massivdan farqi Count (Length emas).
  • For Each ichida ro'yxatni o'zgartirish xato beradi - RemoveAll yoki teskari indeks sikli ishlating.
  • Dictionary kalit orqali qidiradi; mavjud bo'lmagan kalit dasturni to'xtatadi, shuning uchun TryGetValue.
  • Dictionary tartibni kafolatlamaydi - kerak bo'lsa OrderBy yoki SortedDictionary.
  • HashSet takrorlarni o'zi rad etadi; Add False qaytarsa - element allaqachon bor edi.
  • Queue - navbat, Stack - stek.
  • Shubhalansangiz List(Of T) dan boshlang.

Keyingi bo'limda protseduralar - Sub va Function ni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.