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.
Ushbu bo‘lim mundarijasi
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:
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()}");
Elementlar soni: 5
Birinchi: 85, oxirgi: 88
Yig'indi: 438
Eng yuqori: 95
O'rtacha: 87.6
Massiv yaratishning bir necha yo'li bor:
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)}");
a: [1,2,3]
c: [0,0,0] - sukut qiymatlari
Teng-mi a va d: True
new int[3] uchta nol beradi, bo'sh emas. Har bir tur uchun sukut
qiymati bor:
| Tur | Sukut qiymati |
|---|---|
int, double | 0 |
bool | false |
char | '\0' |
string va boshqa havola turlari | null |
Oxirgi qator muhim: new string[3] uchta null beradi va ularga
murojaat qilish dasturni qulatadi. Bu 12-bo'limdagi asosiy mavzu.
Massivni o'zgartirish #
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}");
Saralangan: 1, 3, 5, 7, 9
Teskari: 9, 7, 5, 3, 1
9 ning o'rni: 0
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:
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")}");
Soni: 4
Kamola, Husanboy, Nodira, Aziza
Nodira bormi: True
Aziza o'rni: 3
| Metod | Vazifasi |
|---|---|
Add | Oxiriga 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 |
Contains | Bormi |
Count | Nechta (massivdagi Length emas) |
Sort | Saralaydi |
Clear | Hammasini o'chiradi |
Length va Count farqiMassivda - 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:
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}");
}
Namangan aholisi: 626000
Shaharlar soni: 4
Namangan 626000
Andijon 441000
Chust 68000
Toshkent 2900000
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");
}
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 #
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))}");
Soni: 2
Andijon qayta qo'shildimi: False
Umumiy: Andijon
HashSet takrorlanishga yo'l qo'ymaydi va Contains tekshiruvini juda
tez bajaradi.
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 #
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()}");
Birinchi chiqadi: Husanboy
Keyingi kim: Malika
Oxirgi chiqadi: uchinchi
| Tur | Qoida | Hayotiy misol |
|---|---|---|
Queue | Birinchi kirgan birinchi chiqadi | Kassadagi navbat |
Stack | Oxirgi kirgan birinchi chiqadi | Taxlangan tarelkalar |
Ko'p o'lchovli massivlar #
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();
}
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:
int[][] tishli =
[
[1],
[1, 2],
[1, 2, 3]
];
foreach (int[] qator in tishli)
{
Console.WriteLine($"{qator.Length} ta: {string.Join(" ", qator)}");
}
1 ta: 1
2 ta: 1 2
3 ta: 1 2 3
Qaysi to'plamni tanlash #
| To'plam | Qachon | Kuchli tomoni |
|---|---|---|
int[] | O'lcham o'zgarmasa | Eng kam xotira, eng tez |
List<T> | Odatiy holat | Qulay, moslashuvchan |
Dictionary<K,V> | Kalit bo'yicha qidirish | Tez qidiruv |
HashSet<T> | Takrorlanmasligi kerak | Tez "bormi?" |
Queue<T> | Navbat | Birinchi kirgan birinchi chiqadi |
Stack<T> | Taxlam | Oxirgi kirgan birinchi chiqadi |
- Beshta bahodan iborat massiv yarating va o'rtachasini toping.
new int[5]yaratib, sukut qiymatlarini chiqaring.List<string>ga element qo'shing, o'chiring va sonini chiqaring.LengthvaCountfarqini o'z so'zingiz bilan yozing.- Uchta shahar aholisidan
Dictionarytuzing. - Mavjud bo'lmagan kalitni
TryGetValuebilan xavfsiz so'rang. HashSetga bir xil elementni ikki marta qo'shib ko'ring.QueuevaStackdan element chiqarish tartibini solishtiring.- 3x3 ko'p o'lchovli massiv yaratib, jadval ko'rinishida chiqaring.
- 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]esanulllar bilan to'ldiriladi.- Massivda
Length, ro'yxatdaCount. Dictionarykalit bo'yicha tez qidiradi; mavjud bo'lmagan kalit istisno beradi -TryGetValueishlating.HashSettakrorlanishga 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.