Aracılığıyla paylaş


Öğretici: Verileri desenlerle eşleştirmek için C# kullanma

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.
  • switch ifadelerini 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:

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.

  1. Codespace'ınız yüklendiğinde, öğreticiler klasöründe patterns.cs adlı yeni bir dosya oluşturun.

  2. Yeni dosyanızı açın.

  3. 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 is ya da switch ifadesi kullanabilirsiniz. Bu ilk örnek, her satırı , karakterinde böler ve ardından ilk dize alanını "DEPOSIT" veya "WITHDRAWAL" değeriyle bir ifade kullanarak is. 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}");
        }
    }
    
  4. Ardından terminal penceresine aşağıdaki metni yazın:

    cd tutorials
    dotnet patterns.cs
    
  5. Çı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.

  1. Aşağıdaki kodu kaynak dosyanızın sonuna ekleyin. TransactionType numaralandırma türünü tanımlar:

    public enum TransactionType
    {
        Deposit,
        Withdrawal,
        Invalid
    }
    
  2. 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);
            }
        }
    }
    
  3. Bildirdiğiniz numaralandırmayı kullanarak TransactionType iş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.

  1. Aşağıdaki kodu kopyalayın. foreach döngünüzdeki iki if ifadesini, kopyaladığınız switch ifadesiyle değiştirin.

    currentBalance += transaction switch
    {
        (TransactionType.Deposit, var amount) => amount,
        (TransactionType.Withdrawal, var amount) => -amount,
        _ => 0.0,
    };
    
  2. 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.

  3. 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 kol TransactionType.Withdrawal asla çalışmaz. Derleyici, kodunuzda bir sorun olduğunu söyler.

    switch ifadesinde 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, switch ifade kapsamlı değildir. Derleyici ayrıca, girişin bazı değerleri anahtar kollarından herhangi biriyle eşleşmiyorsa bir uyarı verir.

  4. Geçersiz değerlerin eşleşmemesi için _ => 0.0, satırını kaldırın.

  5. 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.

  1. Kod dosyanızın sonuna aşağıdaki bildirimleri ekleyin:

    public record Deposit(double Amount, string description);
    public record Withdrawal(double Amount, string description);
    
  2. Bu yöntemi numaralandırma bildiriminden TransactionType hemen ö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]);
            }
        }
    }
    
  3. Son foreach dö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}");
    }
    
  4. 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:

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.