4-bo‘lim

Satrlar bilan ishlash

Satr o'zgarmasligi, interpolatsiya, xom satr literallari, qidirish va kesish, Split va Join, StringBuilder hamda solishtirish qoidalari.

🕑 15 daqiqa o‘qish 📄 840 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Satr o'zgarmas
  2. Satr interpolatsiyasi
  3. Formatlash
  4. Xom satr literallari
  5. Asosiy metodlar
  6. Split va Join
  7. Solishtirish
  8. Bo'shliq tekshirish
  9. StringBuilder - ko'p marta qo'shganda
  10. Belgilar bo'yicha yurish
  11. Xulosa

Matn bilan ishlash dasturchining kundalik ishi. C# da satrlar kuchli va qulay, lekin bir nechta muhim xususiyati bor.

Satr o'zgarmas #

Bu eng muhim qoida: C# da satrni tahrirlab bo'lmaydi. Har bir amal yangi satr yaratadi.

CSHARP
string asl = "salom";
string katta = asl.ToUpper();

Console.WriteLine($"asl:   {asl}");
Console.WriteLine($"katta: {katta}");
Natija
asl:   salom
katta: SALOM

ToUpper() asl satrni o'zgartirmadi - u yangi satr qaytardi. Shu sababli natijani o'zgaruvchiga saqlash kerak; aks holda u yo'qoladi.

Eng ko'p uchraydigan boshlang'ich xato
CSHARP
string ism = "  Husanboy  ";
ism.Trim();                        // natija tashlab yuborildi
Console.WriteLine($"[{ism}]");

ism = ism.Trim();                  // to'g'ri
Console.WriteLine($"[{ism}]");
Natija
[  Husanboy  ]
[Husanboy]

Birinchi Trim() chaqiruvi bekorga ketdi. Trim, Replace, ToUpper va boshqa barcha satr metodlari yangi satr qaytaradi - ularni o'zlashtirmasangiz, hech narsa o'zgarmaydi.

Satr interpolatsiyasi #

$ belgisi bilan boshlangan satr ichida {} qavslarda ifoda yozish mumkin:

CSHARP
string ism = "Malika";
int yosh = 20;

Console.WriteLine($"{ism} - {yosh} yosh");
Console.WriteLine($"Kelasi yil: {yosh + 1}");
Console.WriteLine($"Bosh harf: {ism[0]}");
Console.WriteLine($"Katta harflar bilan: {ism.ToUpper()}");
Natija
Malika - 20 yosh
Kelasi yil: 21
Bosh harf: M
Katta harflar bilan: MALIKA

Qavs ichida istalgan ifoda bo'lishi mumkin: amal, metod chaqiruvi, hatto shart.

Formatlash #

CSHARP
using System.Globalization;

var inv = CultureInfo.InvariantCulture;
int son = 42;
double kasr = 3.14159;

Console.WriteLine($"{son,8}|");
Console.WriteLine($"{son,-8}|");
Console.WriteLine(string.Format(inv, "{0:F2}", kasr));
Console.WriteLine(string.Format(inv, "{0:P1}", 0.756));
Console.WriteLine($"{son:D5}");
Natija
      42|
42      |
3.14
75.6 %
00042
BelgiNima qiladi
,8O'ngga tekislab, 8 belgi joy
,-8Chapga tekislab
:F2Kasrdan keyin 2 raqam
:P1Foiz ko'rinishida (invariant madaniyat % oldiga bo'shliq qo'yadi)
:D5Nollar bilan to'ldirib, 5 raqam
Nega bu yerda string.Format ishlatildi?

$"{kasr:F2}" yozsak ham ishlaydi, lekin natija joriy madaniyatga bog'liq bo'ladi: rus tiliga sozlangan tizimda 3,14 chiqadi.

3-bo'limdagi qoidani eslang: natija bashorat qilinadigan bo'lishi kerak bo'lsa, madaniyatni oshkora ko'rsating. string.Format birinchi argument sifatida madaniyatni qabul qiladi.

Shu sababli bu darslikda kasr sonlar aynan shunday chiqariladi.

Xom satr literallari #

Uch qo'shtirnoq (""") ichida hech narsa maxsus emas - qochish belgilari kerak emas:

CSHARP
string yol = """C:\Users\Husanboy\Hujjatlar""";
Console.WriteLine(yol);

string json = """
    {
        "ism": "Husanboy",
        "shahar": "Namangan"
    }
    """;
Console.WriteLine(json);
Natija
C:\Users\Husanboy\Hujjatlar
{
    "ism": "Husanboy",
    "shahar": "Namangan"
}

Diqqat: yopuvchi """ qanchalik chekinsa, har bir qatordan shuncha bo'shliq olib tashlanadi. Shuning uchun JSON chap chekkadan boshlandi.

Qachon xom satr kerak

Uch holatda u ishni sezilarli osonlashtiradi:

  1. Fayl yo'llari - "C:\Users\..." o'rniga;
  2. JSON va XML - har bir qo'shtirnoqni qochirish shart emas;
  3. Ko'p qatorli matn - \n yozmasdan.

Eski uslubda @ bilan ham yozish mumkin (@"C:\Users"), lekin unda qo'shtirnoqni ikki marta yozish kerak. Xom satr qulayroq.

Asosiy metodlar #

CSHARP
string matn = "Namangan viloyati";

Console.WriteLine(matn.Length);
Console.WriteLine(matn.ToUpper());
Console.WriteLine(matn.Contains("viloyat"));
Console.WriteLine(matn.StartsWith("Naman"));
Console.WriteLine(matn.IndexOf("viloyat"));
Console.WriteLine(matn.Substring(0, 8));
Console.WriteLine(matn.Replace("viloyati", "shahri"));
Natija
17
NAMANGAN VILOYATI
True
True
9
Namangan
Namangan shahri
MetodVazifasi
LengthBelgilar soni
ToUpper / ToLowerKatta / kichik harf
TrimChetlardagi bo'shliqlarni olib tashlaydi
ContainsIchida bormi
StartsWith / EndsWithBoshlanadimi / tugaydimi
IndexOfO'rnini topadi, topilmasa -1
SubstringBir qismini ajratib oladi
ReplaceAlmashtiradi
SplitBo'laklarga ajratadi
string.JoinBo'laklarni birlashtiradi

Split va Join #

CSHARP
string qator = "Namangan,Andijon,Samarqand,Toshkent";

string[] shaharlar = qator.Split(',');
Console.WriteLine($"Bo'laklar soni: {shaharlar.Length}");

foreach (string shahar in shaharlar)
{
    Console.WriteLine($"  - {shahar}");
}

Console.WriteLine(string.Join(" | ", shaharlar));
Natija
Bo'laklar soni: 4
  - Namangan
  - Andijon
  - Samarqand
  - Toshkent
Namangan | Andijon | Samarqand | Toshkent

Bo'sh bo'laklarni tashlab yuborish uchun:

CSHARP
string chalkash = "bir,,ikki, ,uch";

string[] hammasi = chalkash.Split(',');
string[] tozalangan = chalkash.Split(',',
                                    StringSplitOptions.RemoveEmptyEntries
                                        | StringSplitOptions.TrimEntries);

Console.WriteLine(
    $"Oddiy:      {hammasi.Length} ta -> [{string.Join("][", hammasi)}]");
Console.WriteLine(
    $"Tozalangan: {tozalangan.Length} ta -> "
    + $"[{string.Join("][", tozalangan)}]");
Natija
Oddiy:      5 ta -> [bir][][ikki][ ][uch]
Tozalangan: 3 ta -> [bir][ikki][uch]

TrimEntries avval bo'shliqlarni qirqadi, keyin RemoveEmptyEntries bo'sh qolganlarini tashlaydi - shuning uchun faqat bo'shliqdan iborat bo'lak ham yo'qoldi.

Solishtirish #

Bu yerda ehtiyot bo'lish kerak:

CSHARP
string a = "salom";
string b = "SALOM";

Console.WriteLine(a == b);
Console.WriteLine(a.Equals(b, StringComparison.OrdinalIgnoreCase));
Console.WriteLine(string.Equals(a, b, StringComparison.Ordinal));
Natija
False
True
False
UsulQachon
==Oddiy, aniq mos kelishi kerak bo'lganda
StringComparison.OrdinalBayt bo'yicha - eng tez va bashoratli
StringComparison.OrdinalIgnoreCaseKatta-kichik harfni e'tiborsiz
StringComparison.CurrentCultureFoydalanuvchiga ko'rsatiladigan saralash
Texnik solishtirishda har doim Ordinal

Fayl kengaytmasi, HTTP sarlavhasi, kalit so'z yoki ID ni solishtirayotgan bo'lsangiz - Ordinal ishlating.

Madaniyatga bog'liq solishtirish ba'zi tillarda kutilmagan natija beradi. Klassik misol - turk tilida I harfi kichik yozilganda nuqtasiz ı ga aylanadi, shuning uchun "FILE".ToLower() == "file" sharti turk tiliga sozlangan tizimda false bo'lib qoladi.

Bu haqiqiy dasturlarda uchragan va "turk I muammosi" degan nom olgan xato. Ordinal undan butunlay xoli.

Bo'shliq tekshirish #

CSHARP
string bosh = "";
string faqatBoshliq = "   ";
string matn = "salom";

Console.WriteLine($"IsNullOrEmpty:      {string.IsNullOrEmpty(bosh)}, "
                  + $"{string.IsNullOrEmpty(faqatBoshliq)}");
Console.WriteLine($"IsNullOrWhiteSpace: {string.IsNullOrWhiteSpace(bosh)}, "
                  + $"{string.IsNullOrWhiteSpace(faqatBoshliq)}");
Console.WriteLine($"Matn uchun:         {string.IsNullOrWhiteSpace(matn)}");
Natija
IsNullOrEmpty:      True, False
IsNullOrWhiteSpace: True, True
Matn uchun:         False

Foydalanuvchi kiritgan ma'lumotni tekshirishda deyarli har doim IsNullOrWhiteSpace kerak: probel bosib yuborgan foydalanuvchi ham hech narsa kiritmagan hisoblanadi.

StringBuilder - ko'p marta qo'shganda #

Satr o'zgarmas bo'lgani uchun, halqa ichida += qilish har safar yangi satr yaratadi. Ko'p takrorlansa, bu sezilarli sekinlashtiradi.

CSHARP
using System.Text;

var quruvchi = new StringBuilder();

for (int i = 1; i <= 5; i++)
{
    quruvchi.Append(i);
    if (i < 5)
    {
        quruvchi.Append(" -> ");
    }
}

Console.WriteLine(quruvchi.ToString());
Console.WriteLine($"Uzunligi: {quruvchi.Length}");
Natija
1 -> 2 -> 3 -> 4 -> 5
Uzunligi: 21
Qachon StringBuilder kerak
HolatNima ishlatish
Bir nechta satrni qo'shishOddiy + yoki interpolatsiya
Halqa ichida, takror soni oz+= ham yetarli
Halqa ichida, yuzlab yoki minglab martaStringBuilder
Ro'yxatni birlashtirishstring.Join - eng qulay

Yodda tuting: uch-to'rt satrni qo'shish uchun StringBuilder ishlatish kodni murakkablashtiradi, foyda bermaydi.

Belgilar bo'yicha yurish #

CSHARP
string soz = "Namangan";
int unliSoni = 0;

foreach (char belgi in soz)
{
    if ("aeiouAEIOU".Contains(belgi))
    {
        unliSoni++;
    }
}

Console.WriteLine($"'{soz}' so'zida {unliSoni} ta unli harf bor");
Console.WriteLine($"Teskarisi: {new string(soz.Reverse().ToArray())}");
Natija
'Namangan' so'zida 3 ta unli harf bor
Teskarisi: nagnamaN
Amaliy topshiriq
  1. Satrning o'zgarmasligini ToUpper misolida o'zingiz tekshiring.
  2. Trim() natijasini o'zlashtirmaslik xatosini takrorlab ko'ring.
  3. Ismingiz va yoshingizni interpolatsiya bilan chiqaring.
  4. Bir sonni F2, P1 va D5 formatlarida chiqaring.
  5. Xom satr literali bilan ko'p qatorli matn yozing.
  6. Vergul bilan ajratilgan ro'yxatni Split qilib, har birini chiqaring.
  7. RemoveEmptyEntries bilan va usiz natijani solishtiring.
  8. Ikki satrni Ordinal va OrdinalIgnoreCase bilan solishtiring.
  9. "Turk I muammosi" nima ekanini o'z so'zingiz bilan yozing.
  10. StringBuilder bilan 1 dan 10 gacha sonlarni bitta satrga yig'ing.

Xulosa #

  • Satrlar o'zgarmas: har bir metod yangi satr qaytaradi, shuning uchun natijani o'zlashtiring.
  • $"..." interpolatsiyasi qavs ichida istalgan ifodani qabul qiladi.
  • Kasr sonni chiqarganda madaniyatni oshkora ko'rsating.
  • """ xom satr - fayl yo'llari, JSON va ko'p qatorli matn uchun.
  • Split + RemoveEmptyEntries + TrimEntries - chalkash ma'lumotni tozalashning eng qisqa yo'li.
  • Texnik solishtirishda har doim StringComparison.Ordinal - "turk I muammosi" shundan kelib chiqadi.
  • Foydalanuvchi kiritgan matnni IsNullOrWhiteSpace bilan tekshiring.
  • Minglab marta qo'shish kerak bo'lsa - StringBuilder.

Keyingi bo'limda shartlar va namuna moslashtirishni 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.