Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, C# dilindeki verileri incelemek için desen eşleştirmenin nasıl kullanılacağı öğretildi. Küçük miktarlarda kod yazar, sonra bu kodu derleyip çalıştırırsınız. Eğitim kılavuzu, C# tarafından desteklenen farklı desen türlerini inceleyen bir dizi ders içerir. Bu dersler size C# dilinin temellerini öğretir.
Bu eğitimde, siz:
- C# geliştirme ortamıyla GitHub Codespace başlatın.
- Ayrık değerler için verileri test edin.
- Enum verilerini değerle karşılaştırın.
-
switchifadelerini kullanarak kapsamlı eşleşmeler oluşturun. - Tür desenlerini kullanarak türleri eşleştirin.
Önkoşullar
Aşağıdakilerden birine sahip olmanız gerekir:
- GitHub Codespaces'ı kullanmak için bir GitHub hesabı. Henüz bir hesabınız yoksa GitHub.com'de ücretsiz bir hesap oluşturabilirsiniz.
- Aşağıdaki araçların yüklü olduğu bir bilgisayar:
Bir değeri eşleştirme
Önceki öğreticilerde, yerleşik türler ve tuplelar veya kayıtlar olarak tanımladığınız türler gösterilmiştir. Bu türlerin örneklerini bir desene göre de kontrol edebilirsiniz. Örneğin bir desenle eşleşip eşleşmediği, programınızın gerçekleştirdiği eylemleri belirler. Aşağıdaki örneklerde, tür adlarının sonrasını görürsünüz ? . Bu simge, bu türün değerinin null olmasını sağlar (örneğin, bool? , trueveya falseolabilirnull). Daha fazla bilgi için bakınız Nullable değer türleri. Şimdi desenleri nasıl kullanabileceğinizi keşfetmeye başlayalım.
GitHub codespaces için bir tarayıcı penceresi açın. .NET Şablonundan yeni bir kod alanı oluşturun. Serinin diğer öğreticilerini tamamladıysanız, o codespace'i açabilirsiniz.
Codespace'ınız yüklendiğinde, öğreticiler klasöründe patterns.cs adlı yeni bir dosya oluşturun.
Yeni dosyanızı açın.
Bu öğreticideki tüm örneklerde, bir dizi banka işlemini virgülle ayrılmış değerler (CSV) girişi olarak temsil eden metin girişi kullanılır. Örneklerin her birinde, bir kaydı bir desenle eşleştirmek için ya
isya daswitchifadesi kullanabilirsiniz. Bu ilk örnek, her satırı,karakterinde böler ve ardından ilk dize alanını "DEPOSIT" veya "WITHDRAWAL" değeriyle bir ifade kullanarakis. Eşleştiğinde, işlem tutarı geçerli hesap bakiyesine eklenir veya düşülür. Çalıştığını görmek için aşağıdaki kodu patterns.cs ekleyin:string bankRecords = """ DEPOSIT, 10000, Initial balance DEPOSIT, 500, regular deposit WITHDRAWAL, 1000, rent DEPOSIT, 2000, freelance payment WITHDRAWAL, 300, groceries DEPOSIT, 700, gift from friend WITHDRAWAL, 150, utility bill DEPOSIT, 1200, tax refund WITHDRAWAL, 500, car maintenance DEPOSIT, 400, cashback reward WITHDRAWAL, 250, dining out DEPOSIT, 3000, bonus payment WITHDRAWAL, 800, loan repayment DEPOSIT, 600, stock dividends WITHDRAWAL, 100, subscription fee DEPOSIT, 1500, side hustle income WITHDRAWAL, 200, fuel expenses DEPOSIT, 900, refund from store WITHDRAWAL, 350, shopping DEPOSIT, 2500, project milestone payment WITHDRAWAL, 400, entertainment """; double currentBalance = 0.0; var reader = new StringReader(bankRecords); string? line; while ((line = reader.ReadLine()) is not null) { if (string.IsNullOrWhiteSpace(line)) continue; // Split the line based on comma delimiter and trim each part string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") currentBalance += amount; else if (transactionType?.ToUpper() is "WITHDRAWAL") currentBalance -= amount; Console.WriteLine($"{line.Trim()} => Parsed Amount: {amount}, New Balance: {currentBalance}"); } }Ardından terminal penceresine aşağıdaki metni yazın:
cd tutorials dotnet patterns.csÇıktıyı inceleyin. Her satırın, ilk alandaki metnin değerini karşılaştırarak işlendiğini görebilirsiniz.
Önceki örneği, iki string değerin eşit olduğunu test etmek için == işlemini kullanarak benzer şekilde inşa edebilirsiniz. Bir değişkeni sabitle karşılaştırmak, desen eşleştirme için temel bir yapı taşıdır. Şimdi desen eşleştirmenin parçası olan yapı taşları hakkında daha fazla bilgi edinelim.
Enumerasyon eşleşmeleri
Desen eşleştirmenin başka bir yaygın kullanımı, bir türün değerleri üzerinde eşleştirmedir enum. Aşağıdaki örnek giriş kayıtlarını işler ve ilk değerin bir para yatırma veya çekme işlemi olduğunu belirten bir kümeenum oluşturur. İkinci değer, işlemin değeridir.
Aşağıdaki kodu kaynak dosyanızın sonuna ekleyin.
TransactionTypenumaralandırma türünü tanımlar:public enum TransactionType { Deposit, Withdrawal, Invalid }Bir banka işlemini işlem türünü ve hareketin değerini tutan bir tanımlama grubuna ayrıştırmak için bir işlev ekleyin. enum bildiriminizden önce aşağıdaki kodu ekleyin:
static IEnumerable<(TransactionType type, double amount)> TransactionRecords(string inputText) { var reader = new StringReader(inputText); string? line; while ((line = reader.ReadLine()) is not null) { string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") yield return (TransactionType.Deposit, amount); else if (transactionType?.ToUpper() is "WITHDRAWAL") yield return (TransactionType.Withdrawal, amount); } else { yield return (TransactionType.Invalid, 0.0); } } }Bildirdiğiniz numaralandırmayı kullanarak
TransactionTypeişlem verilerini işlemek için yeni bir döngü ekleyin:currentBalance = 0.0; foreach (var transaction in TransactionRecords(bankRecords)) { if (transaction.type == TransactionType.Deposit) currentBalance += transaction.amount; else if (transaction.type == TransactionType.Withdrawal) currentBalance -= transaction.amount; Console.WriteLine($"{transaction.type} => Parsed Amount: {transaction.amount}, New Balance: {currentBalance}"); }
Yukarıdaki örnekte, ifadenin if değerini denetlemek için bir enum deyim de kullanılır. Başka bir desen eşleştirme biçimi bir switch ifade kullanır. Şimdi söz dizimlerini ve nasıl kullanabileceğinizi inceleyelim.
ile kapsamlı eşleşmeler switch
Bir dizi if deyim, bir dizi koşulu test edebilir. Ancak derleyici, bir dizi deyimin if olup olmadığını veya daha sonraki koşulların if önceki koşullar tarafından alt sıralanmış olup olmadığını anlayamaz.
Kapsamlı , test serisindeki if veya else yan tümcelerinden birinin tüm olası girişleri işlediği anlamına gelir. Bir dizi if deyim kapsamlıysa, olası her giriş en az bir if veya else koşulunu karşılar.
Subsumption, önceki if veya else yan tümceler tüm olası girişlerle eşleştiğinden sonraki if veya else yan tümceye ulaşılamadığı anlamına gelir. Örneğin, aşağıdaki örnek kodda bir yan tümce hiçbir zaman eşleşmez:
int n = GetNumber();
if (n < 20)
Console.WriteLine("n is less than 20");
else if (n < 10)
Console.WriteLine("n is less than 10"); // unreachable
else
Console.WriteLine("n is greater than 20");
else if koşulu hiçbir zaman eşleşmez çünkü 10'dan küçük her sayı aynı zamanda 20'den küçüktür. İfade, switch bu özelliklerin her ikisinin de karşılanmasını sağlar ve bu da uygulamalarınızda daha az hatayla sonuçlanıyor. Deneyelim ve keşfedelim.
Aşağıdaki kodu kopyalayın.
foreachdöngünüzdeki ikiififadesini, kopyaladığınızswitchifadesiyle değiştirin.currentBalance += transaction switch { (TransactionType.Deposit, var amount) => amount, (TransactionType.Withdrawal, var amount) => -amount, _ => 0.0, };Yeni örneği çalıştırmak için terminal penceresine yazın
dotnet patterns.cs.Kodu çalıştırdığınızda aynı şekilde çalıştığını görürsünüz.
Kapsama işlemini göstermek için, switch kollarını aşağıdaki kod parçacığında gösterildiği gibi yeniden sırala:
currentBalance += transaction switch { (TransactionType.Deposit, var amount) => amount, _ => 0.0, (TransactionType.Withdrawal, var amount) => -amount, };Anahtar kollarını yeniden sıraladıktan sonra terminal penceresine yazın
dotnet patterns.cs._ile kol her değerle eşleştiğinden, derleyici bir hata verir. Sonuç olarak, o son kolTransactionType.Withdrawalasla çalışmaz. Derleyici, kodunuzda bir sorun olduğunu söyler.switchifadesinde test edilen bir ifade, herhangi bir anahtar kolu ile eşleşmeyen değerler içerebilecekse, derleyici bir uyarı verir. Bazı değerler herhangi bir koşulla eşleşemezse,switchifade kapsamlı değildir. Derleyici ayrıca, girişin bazı değerleri anahtar kollarından herhangi biriyle eşleşmiyorsa bir uyarı verir.Geçersiz değerlerin eşleşmemesi için
_ => 0.0,satırını kaldırın.Sonuçları görmek için yazın
dotnet patterns.cs.Derleyici uyarı verir. Test verileri geçerli olduğundan program çalışır. Ancak, geçersiz veriler çalışma zamanında hataya neden olabilir.
Tip şablonları
Bu öğreticiyi tamamlamak için desen eşleştirme için bir yapı taşı daha keşfedin: tür deseni.
Tür deseni, belirtilen türde olup olmadığını görmek için bir ifadeyi çalışma zamanında test eder. Ya bir is ifadesi ya da bir switch ifadesi ile bir tür testi kullanabilirsiniz. Geçerli örneği iki şekilde değiştirin. İlk olarak, bir demet yerine, işlemleri temsil eden Deposit ve Withdrawal kayıt türlerini oluşturun.
Kod dosyanızın sonuna aşağıdaki bildirimleri ekleyin:
public record Deposit(double Amount, string description); public record Withdrawal(double Amount, string description);Bu yöntemi numaralandırma bildiriminden
TransactionTypehemen önce ekleyin. Metni ayrıştırarak bir dizi kayıt döndürür:static IEnumerable<object?> TransactionRecordType(string inputText) { var reader = new StringReader(inputText); string? line; while ((line = reader.ReadLine()) is not null) { string[] parts = line.Split(','); string? transactionType = parts[0]?.Trim(); if (double.TryParse(parts[1].Trim(), out double amount)) { // Update the balance based on transaction type if (transactionType?.ToUpper() is "DEPOSIT") yield return new Deposit(amount, parts[2]); else if (transactionType?.ToUpper() is "WITHDRAWAL") yield return new Withdrawal(amount, parts[2]); } } }Son
foreachdöngüden sonra aşağıdaki kodu ekleyin:currentBalance = 0.0; foreach (var transaction in TransactionRecordType(bankRecords)) { currentBalance += transaction switch { Deposit d => d.Amount, Withdrawal w => -w.Amount, _ => 0.0, }; Console.WriteLine($" {transaction} => New Balance: {currentBalance}"); }Sonuçları görmek için terminal penceresine yazın
dotnet patterns.cs. "Nihai sürüm, girişi bir türe göre test ediyor."
Desen eşleştirme, bir ifadeyi özelliklerle karşılaştırmak için bir sözlük sağlar. Desenler ifadenin türünü, tür değerlerini, özellik değerlerini ve bunların birleşimlerini içerebilir. İfadeleri bir desenle karşılaştırmak, birden çok if karşılaştırmadan daha net olabilir. İfadeleri eşleştirmek için kullanabileceğiniz bazı desenleri keşfettiniz. Uygulamalarınızda desen eşleştirmeyi kullanmanın birçok farklı yolu vardır. Keşfettikçe, aşağıdaki makalelerde C# dilinde desen eşleştirme hakkında daha fazla bilgi edinebilirsiniz:
- C#'de desen eşleştirme
- Desen eşleştirme öğreticisi keşfetme
- Desen eşleştirme senaryosu
Kaynakları temizleme
GitHub, 30 günlük etkinlik dışı kalma süresinden sonra Codespace'inizi otomatik olarak siler. Bu serideki tüm öğreticileri tamamladınız. Codespace'ınızı şimdi silmek için bir tarayıcı penceresi açın ve Codespaces'inize gidin. Pencerede kod boşluklarınızın listesini görmeniz gerekir. Learn eğitim kod alanının girişindeki üç noktayı (...) seçin ve sil seçin.
İlgili içerik
- .NET 10 SDK'sını indirip yükleyin.
- Visual Studio Code uygulamasını indirip yükleyin.
- C# DevKit'i indirip yükleyin.
- C# hakkında daha fazla bilgi edinmek için C # ile ilgili temel bilgiler bölümünü inceleyin.