7-bo‘lim

Massivlar va to'plamlar

Massivlar, ko'p o'lchovli va tishli massivlar, List, Dictionary, HashSet, Queue va Stack; to'plam ifodalari va qaysi birini tanlash.

🕑 13 daqiqa o‘qish 📄 684 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Massiv
  2. Massivni o'zgartirish
  3. List - o'zgaruvchan ro'yxat
  4. Dictionary - kalit va qiymat
  5. HashSet - takrorlanmas to'plam
  6. Queue va Stack
  7. Ko'p o'lchovli massivlar
  8. Qaysi to'plamni tanlash
  9. Xulosa

Ma'lumotni guruhlab saqlash - dasturlashning asosiy ehtiyoji. C# da buning uchun bir nechta vosita bor va ularning har biri boshqacha ish uchun.

Massiv #

Massiv - o'lchami o'zgarmaydigan ketma-ketlik:

CSHARP
int[] ballar = [85, 92, 78, 95, 88];

Console.WriteLine($"Elementlar soni: {ballar.Length}");
Console.WriteLine($"Birinchi: {ballar[0]}, oxirgi: {ballar[^1]}");
Console.WriteLine($"Yig'indi: {ballar.Sum()}");
Console.WriteLine($"Eng yuqori: {ballar.Max()}");
Console.WriteLine($"O'rtacha: {ballar.Average()}");
Natija
Elementlar soni: 5
Birinchi: 85, oxirgi: 88
Yig'indi: 438
Eng yuqori: 95
O'rtacha: 87.6

Massiv yaratishning bir necha yo'li bor:

CSHARP
int[] a = [1, 2, 3];                   // to'plam ifodasi (C# 12)
int[] b = { 1, 2, 3 };                 // eski yozuv
int[] c = new int[3];                  // uchta nol bilan to'ldirilgan
int[] d = new int[] { 1, 2, 3 };       // to'liq yozuv

Console.WriteLine($"a: [{string.Join(",", a)}]");
Console.WriteLine($"c: [{string.Join(",", c)}]  - sukut qiymatlari");
Console.WriteLine($"Teng-mi a va d: {a.SequenceEqual(d)}");
Natija
a: [1,2,3]
c: [0,0,0]  - sukut qiymatlari
Teng-mi a va d: True
Sukut qiymatlari

new int[3] uchta nol beradi, bo'sh emas. Har bir tur uchun sukut qiymati bor:

TurSukut qiymati
int, double0
boolfalse
char'\0'
string va boshqa havola turlarinull

Oxirgi qator muhim: new string[3] uchta null beradi va ularga murojaat qilish dasturni qulatadi. Bu 12-bo'limdagi asosiy mavzu.

Massivni o'zgartirish #

CSHARP
int[] sonlar = [5, 3, 9, 1, 7];

Array.Sort(sonlar);
Console.WriteLine($"Saralangan: {string.Join(", ", sonlar)}");

Array.Reverse(sonlar);
Console.WriteLine($"Teskari:    {string.Join(", ", sonlar)}");

int orni = Array.IndexOf(sonlar, 9);
Console.WriteLine($"9 ning o'rni: {orni}");
Natija
Saralangan: 1, 3, 5, 7, 9
Teskari:    9, 7, 5, 3, 1
9 ning o'rni: 0
Massiv o'lchami o'zgarmaydi

Massivga element qo'shib bo'lmaydi. Array.Resize bor, lekin u aslida yangi massiv yaratib, hammasini ko'chiradi - ya'ni qimmat amal.

Elementlar soni o'zgarib turadigan bo'lsa, massiv emas, List<T> kerak.

List - o'zgaruvchan ro'yxat #

Amalda eng ko'p ishlatiladigan to'plam:

CSHARP
List<string> talabalar = ["Husanboy", "Malika"];

talabalar.Add("Nodira");
talabalar.Add("Aziza");
talabalar.Insert(0, "Kamola");
talabalar.Remove("Malika");

Console.WriteLine($"Soni: {talabalar.Count}");
Console.WriteLine(string.Join(", ", talabalar));
Console.WriteLine($"Nodira bormi: {talabalar.Contains("Nodira")}");
Console.WriteLine($"Aziza o'rni: {talabalar.IndexOf("Aziza")}");
Natija
Soni: 4
Kamola, Husanboy, Nodira, Aziza
Nodira bormi: True
Aziza o'rni: 3
MetodVazifasi
AddOxiriga qo'shadi
Insert(i, x)Berilgan o'ringa qo'yadi
Remove(x)Birinchi mos elementni o'chiradi
RemoveAt(i)Indeks bo'yicha o'chiradi
RemoveAll(shart)Shartga mos hammasini o'chiradi
ContainsBormi
CountNechta (massivdagi Length emas)
SortSaralaydi
ClearHammasini o'chiradi
Length va Count farqi

Massivda - Length, ro'yxatda - Count.

Buni chalkashtirish yangi boshlovchilarning tez-tez uchraydigan xatosi. Sababi tarixiy: Length massivning qat'iy o'lchamini, Count esa hozirgi elementlar sonini bildiradi.

Dictionary - kalit va qiymat #

Nom bo'yicha qidirish kerak bo'lganda:

CSHARP
Dictionary<string, int> aholi = new()
{
    ["Namangan"] = 626000,
    ["Andijon"] = 441000,
    ["Chust"] = 68000
};

aholi["Toshkent"] = 2900000;

Console.WriteLine($"Namangan aholisi: {aholi["Namangan"]}");
Console.WriteLine($"Shaharlar soni: {aholi.Count}");

foreach ((string shahar, int soni) in aholi)
{
    Console.WriteLine($"  {shahar,-10} {soni,9}");
}
Natija
Namangan aholisi: 626000
Shaharlar soni: 4
  Namangan      626000
  Andijon       441000
  Chust          68000
  Toshkent     2900000
Mavjud bo'lmagan kalit istisno beradi
CSHARP
Dictionary<string, int> aholi = new() { ["Namangan"] = 626000 };

try
{
    Console.WriteLine(aholi["Buxoro"]);
}
catch (KeyNotFoundException)
{
    Console.WriteLine("Bunday kalit yo'q");
}

// To'g'ri yo'l:
if (aholi.TryGetValue("Buxoro", out int soni))
{
    Console.WriteLine($"Buxoro: {soni}");
}
else
{
    Console.WriteLine("Buxoro topilmadi");
}
Natija
Bunday kalit yo'q
Buxoro topilmadi

Kalit borligiga ishonchingiz komil bo'lmasa - har doim TryGetValue. ContainsKey bilan tekshirib, keyin [...] bilan olish ham ishlaydi, lekin u lug'atni ikki marta qidiradi.

HashSet - takrorlanmas to'plam #

CSHARP
HashSet<string> shaharlar = ["Namangan", "Andijon", "Namangan"];

Console.WriteLine($"Soni: {shaharlar.Count}");

bool qoshildi = shaharlar.Add("Andijon");
Console.WriteLine($"Andijon qayta qo'shildimi: {qoshildi}");

HashSet<string> boshqa = ["Andijon", "Buxoro"];
Console.WriteLine(
    $"Umumiy: {string.Join(", ", shaharlar.Intersect(boshqa))}");
Natija
Soni: 2
Andijon qayta qo'shildimi: False
Umumiy: Andijon

HashSet takrorlanishga yo'l qo'ymaydi va Contains tekshiruvini juda tez bajaradi.

Tezlik farqi amalda

List.Contains ro'yxatni boshidan oxirigacha qidiradi. HashSet esa xesh jadvalidan foydalanadi va elementlar soniga deyarli bog'liq emas.

Ming elementli ro'yxatda farq sezilmaydi. Yuz mingtada esa sezilarli - List yuz ming marta solishtirishi mumkin, HashSet esa bitta hisoblash bilan javob beradi.

Qoida: faqat "bormi?" degan savol muhim bo'lsa - HashSet.

Queue va Stack #

CSHARP
Queue<string> navbat = new();
navbat.Enqueue("Husanboy");
navbat.Enqueue("Malika");
navbat.Enqueue("Nodira");

Console.WriteLine($"Birinchi chiqadi: {navbat.Dequeue()}");
Console.WriteLine($"Keyingi kim: {navbat.Peek()}");

Stack<string> taxlam = new();
taxlam.Push("birinchi");
taxlam.Push("ikkinchi");
taxlam.Push("uchinchi");

Console.WriteLine($"Oxirgi chiqadi: {taxlam.Pop()}");
Natija
Birinchi chiqadi: Husanboy
Keyingi kim: Malika
Oxirgi chiqadi: uchinchi
TurQoidaHayotiy misol
QueueBirinchi kirgan birinchi chiqadiKassadagi navbat
StackOxirgi kirgan birinchi chiqadiTaxlangan tarelkalar

Ko'p o'lchovli massivlar #

CSHARP
int[,] jadval = new int[3, 4];

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++)
    {
        jadval[i, j] = (i + 1) * (j + 1);
    }
}

for (int i = 0; i < jadval.GetLength(0); i++)
{
    for (int j = 0; j < jadval.GetLength(1); j++)
    {
        Console.Write($"{jadval[i, j],4}");
    }
    Console.WriteLine();
}
Natija
   1   2   3   4
   2   4   6   8
   3   6   9  12

Tishli massiv esa - massivlar massivi, har bir qatori turli uzunlikda bo'lishi mumkin:

CSHARP
int[][] tishli =
[
    [1],
    [1, 2],
    [1, 2, 3]
];

foreach (int[] qator in tishli)
{
    Console.WriteLine($"{qator.Length} ta: {string.Join(" ", qator)}");
}
Natija
1 ta: 1
2 ta: 1 2
3 ta: 1 2 3

Qaysi to'plamni tanlash #

Qaysi to'plam kerak? Ma'lumotni saqlash kerak Kalit bo'yicha qidirasizmi? Takror bo'lmasinmi? Tartib muhimmi? Dictionary nom -> qiymat HashSet tez "bormi?" tekshiruvi List odatiy tanlov Maxsus holatlar: navbat kerak bo'lsa Queue, taxlam kerak bo'lsa Stack. Elementlar soni umuman o'zgarmasa va tezlik juda muhim bo'lsa - oddiy massiv. Ikkilansangiz List ni oling - keyin kerak bo'lsa almashtirish oson.
Ikkilansangiz List dan boshlang
To'plamQachonKuchli tomoni
int[]O'lcham o'zgarmasaEng kam xotira, eng tez
List<T>Odatiy holatQulay, moslashuvchan
Dictionary<K,V>Kalit bo'yicha qidirishTez qidiruv
HashSet<T>Takrorlanmasligi kerakTez "bormi?"
Queue<T>NavbatBirinchi kirgan birinchi chiqadi
Stack<T>TaxlamOxirgi kirgan birinchi chiqadi
Amaliy topshiriq
  1. Beshta bahodan iborat massiv yarating va o'rtachasini toping.
  2. new int[5] yaratib, sukut qiymatlarini chiqaring.
  3. List<string> ga element qo'shing, o'chiring va sonini chiqaring.
  4. Length va Count farqini o'z so'zingiz bilan yozing.
  5. Uchta shahar aholisidan Dictionary tuzing.
  6. Mavjud bo'lmagan kalitni TryGetValue bilan xavfsiz so'rang.
  7. HashSet ga bir xil elementni ikki marta qo'shib ko'ring.
  8. Queue va Stack dan element chiqarish tartibini solishtiring.
  9. 3x3 ko'p o'lchovli massiv yaratib, jadval ko'rinishida chiqaring.
  10. Tishli massiv bilan har xil uzunlikdagi qatorlarni saqlang.

Xulosa #

  • Massiv o'lchami o'zgarmas; element soni o'zgarsa - List<T>.
  • new int[3] nollar bilan, new string[3] esa null lar bilan to'ldiriladi.
  • Massivda Length, ro'yxatda Count.
  • Dictionary kalit bo'yicha tez qidiradi; mavjud bo'lmagan kalit istisno beradi - TryGetValue ishlating.
  • HashSet takrorlanishga yo'l qo'ymaydi va "bormi?" savoliga juda tez javob beradi.
  • Queue - navbat, Stack - taxlam.
  • [...] to'plam ifodasi massiv, ro'yxat va to'plamlar uchun bir xil ishlaydi.
  • Ikkilansangiz - List<T>.

Keyingi bo'limda metodlarni 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.