Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Tutorial ini mengajarkan Anda cara menggunakan pencocokan pola untuk memeriksa data di C#. Anda menulis kode dalam jumlah kecil, lalu mengkompilasi dan menjalankan kode tersebut. Tutorial ini berisi serangkaian pelajaran yang mengeksplorasi berbagai jenis dalam C#. Pelajaran ini mengajarkan Anda dasar-dasar bahasa C#.
Petunjuk / Saran
Saat blok cuplikan kode menyertakan tombol "Jalankan", tombol tersebut membuka jendela interaktif, atau mengganti kode yang ada di jendela interaktif. Saat cuplikan tidak menyertakan tombol "Jalankan", Anda dapat menyalin kode dan menambahkannya ke jendela interaktif saat ini.
Tutorial sebelumnya menunjukkan tipe bawaan dan tipe yang Anda definisikan sebagai tuple atau record. Perwujudan jenis ini dapat diperiksa berdasarkan pola. Apakah suatu instans cocok dengan pola menentukan tindakan yang akan diambil oleh program Anda. Dalam contoh di bawah ini, Anda akan melihat ? setelah nama jenis. Simbol ini memungkinkan nilai jenis ini null (misalnya, bool? bisa true, false atau null). Untuk informasi selengkapnya, lihat Jenis nilai nullable. Mari kita mulai menjelajahi bagaimana Anda dapat menggunakan pola.
Sesuaikan nilai
Semua contoh dalam tutorial ini menggunakan input teks yang mewakili serangkaian transaksi bank sebagai input nilai yang dipisahkan koma (CSV). Di setiap sampel, Anda dapat mencocokkan rekaman dengan pola, baik menggunakan ekspresi is ataupun switch. Contoh pertama ini membagi setiap baris pada karakter , lalu mencocokkan bidang string pertama dengan nilai "DEPOSIT" atau "WITHDRAWAL" menggunakan ekspresi . Ketika cocok, jumlah transaksi ditambahkan atau dikurangi dari saldo akun saat ini. Untuk melihatnya berfungsi, tekan tombol "Jalankan":
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}");
}
}
Periksa output. Anda dapat melihat bahwa setiap baris diproses dengan membandingkan nilai teks di bidang pertama. Sampel sebelumnya dapat dibuat dengan cara yang sama menggunakan == operator untuk menguji bahwa dua string nilai sama. Membandingkan variabel dengan konstanta adalah blok penyusun dasar untuk pencocokan pola. Mari kita jelajahi lebih banyak blok bangunan yang merupakan bagian dari pencocokan pola.
Enum cocok
Penggunaan umum lain untuk pencocokan pola adalah untuk mencocokkan nilai jenis enum . Sampel berikutnya memproses rekaman input untuk membuat tuple di mana nilai pertama adalah enum nilai yang mencatat setoran atau penarikan. Nilai kedua adalah nilai transaksi. Untuk melihatnya berfungsi, tekan tombol "Jalankan":
Peringatan
Jangan salin dan tempel. Jendela interaktif harus diatur ulang untuk menjalankan sampel berikut. Jika Anda membuat kesalahan, jendela menjadi tidak responsif, dan Anda perlu memuat ulang halaman untuk melanjutkan.
public static class ExampleProgram
{
const 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
""";
public static void Main()
{
double 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}");
}
}
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);
}
}
}
}
public enum TransactionType
{
Deposit,
Withdrawal,
Invalid
}
Contoh sebelumnya juga menggunakan if pernyataan untuk memeriksa nilai enum ekspresi. Bentuk pencocokan pola lain menggunakan switch ekspresi. Mari kita jelajahi sintaksis itu dan bagaimana Anda dapat menggunakannya.
Kecocokan lengkap dengan switch
Serangkaian if pernyataan dapat menguji serangkaian kondisi. Tapi, kompilator tidak dapat mengetahui apakah serangkaian pernyataan tersebut lengkap atau jika kondisi berikutnya dicakup oleh kondisi sebelumnya. Ekspresi switch memastikan kedua karakteristik tersebut terpenuhi, yang menghasilkan lebih sedikit bug di aplikasi Anda. Mari kita coba dan bereksperimen. Salin kode berikut. Ganti dua if pernyataan di jendela interaktif dengan ekspresi yang switch Anda salin. Setelah Anda memodifikasi kode, tekan tombol "Jalankan" di bagian atas jendela interaktif untuk menjalankan sampel baru.
currentBalance += transaction switch
{
(TransactionType.Deposit, var amount) => amount,
(TransactionType.Withdrawal, var amount) => -amount,
_ => 0.0,
};
Saat Anda menjalankan kode, Anda melihat bahwa kode berfungsi sama. Untuk menunjukkan subsumption, susun ulang lengan sakelar seperti yang ditunjukkan dalam cuplikan berikut:
currentBalance += transaction switch
{
(TransactionType.Deposit, var amount) => amount,
_ => 0.0,
(TransactionType.Withdrawal, var amount) => -amount,
};
Setelah Anda menyusun ulang lengan sakelar, tekan tombol "Jalankan". Kompilator mengeluarkan kesalahan karena lengan dengan _ kecocokan setiap nilai. Akibatnya, bagian terakhir dengan TransactionType.Withdrawal tidak pernah dijalankan. Pengkompilasi memberi tahu Anda bahwa ada sesuatu yang salah dalam kode Anda.
Pengkompilasi mengeluarkan peringatan jika ekspresi yang diuji dalam ekspresi switch dapat berisi nilai yang tidak sesuai dengan alternatif switch mana pun. Jika beberapa nilai gagal mencocokkan switch kondisi apa pun, ekspresi tidak lengkap. Pengkompilasi juga mengeluarkan peringatan jika beberapa nilai input tidak cocok dengan salah satu lengan sakelar. Misalnya, jika Anda menghapus baris yang berisi _ => 0.0,, nilai yang tidak valid tidak akan sesuai. Pada saat runtime, itu akan gagal. Setelah menginstal .NET SDK dan membangun program di lingkungan Anda, Anda dapat menguji perilaku ini. Pengalaman online tidak menampilkan peringatan di jendela output.
Pola jenis
Untuk menyelesaikan tutorial ini, mari kita jelajahi satu blok penyusun lagi ke pencocokan pola: pola jenis.
Pola tipe menguji ekspresi pada runtime untuk melihat apakah itu jenis yang telah ditentukan. Anda dapat menggunakan pengujian jenis baik dengan ekspresi is maupun ekspresi switch. Mari kita ubah sampel saat ini dengan dua cara. Pertama, alih-alih tuple, mari kita buat Deposit dan Withdrawal rekam jenis yang mewakili transaksi. Tambahkan deklarasi berikut di bagian bawah jendela interaktif:
public record Deposit(double Amount, string description);
public record Withdrawal(double Amount, string description);
Selanjutnya, tambahkan metode ini setelah Main metode untuk mengurai teks dan mengembalikan serangkaian rekaman:
public 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]);
}
yield return default;
}
}
Terakhir, ganti perulangan foreach dalam Main metode dengan kode berikut:
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}");
}
Kemudian, tekan tombol "Jalankan" untuk melihat hasilnya. Versi akhir ini menguji input terhadap jenis.
Pencocokan pola menyediakan kosakata untuk membandingkan ekspresi dengan karakteristik. Pola dapat mencakup jenis ekspresi, nilai jenis, nilai properti, dan kombinasinya. Membandingkan ekspresi dengan sebuah pola dapat lebih mudah dipahami daripada beberapa perbandingan if. Anda menjelajahi beberapa pola yang dapat Anda gunakan untuk mencocokkan ekspresi. Ada lebih banyak cara untuk menggunakan pencocokan pola di aplikasi Anda. Pertama, kunjungi situs .NET untuk mengunduh .NET SDK, membuat proyek di komputer Anda, dan terus mengkoding. Saat menjelajahi, Anda dapat mempelajari lebih lanjut tentang pencocokan pola di C# di artikel berikut: