Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag bemutatja, hogyan használható mintamegfeleltetés a C#-ban lévő adatok vizsgálatához. Kis mennyiségű kódot ír, majd lefordítja és futtatja a kódot. Az oktatóanyag számos olyan leckét tartalmaz, amelyek a C# különböző típusait vizsgálják. Ezek a leckék a C# nyelv alapjait tanítják meg.
Jótanács
Ha egy kódrészletblokk tartalmazza a "Futtatás" gombot, az a gomb megnyitja az interaktív ablakot, vagy lecseréli a meglévő kódot az interaktív ablakban. Ha a kódrészlet nem tartalmaz "Futtatás" gombot, átmásolhatja a kódot, és hozzáadhatja az aktuális interaktív ablakhoz.
Az előző oktatóanyagok bemutatták a beépített típusokat, valamint azokat a típusokat, amelyeket rekordokként vagy tupleként definiálsz. Az ilyen típusú példányok egy mintán ellenőrizhetők. Az, hogy egy példány megfelel-e egy mintának, meghatározza a program által végrehajtott műveleteket. Az alábbi példákban a típusnevek után fog megjelenni ? . Ez a szimbólum lehetővé teszi, hogy az ilyen típusú értékek null értékűek legyenek (például bool? lehet true, false vagy null). További információ: Null értékű értéktípusok. Kezdjük el megvizsgálni, hogyan használhatja a mintákat.
Érték egyeztetése
Az oktatóanyagban szereplő összes példa szövegbevitelt használ, amely vesszővel tagolt értékként (CSV) adja meg a banki tranzakciók sorozatát. Az egyes mintákban egy rekordot egy mintával egyeztethet egy is vagy switch kifejezés használatával. Ez az első példa felosztja az egyes sorokat a , karakter mentén, majd a kifejezéssel összeveti az első sztringmezőt a "DEPOSIT" vagy a "WITHDRAWAL" értékkel. Ha megegyezik, a tranzakció összege hozzáadódik vagy levonódik az aktuális számla egyenlegéből. A működéshez nyomja le a "Futtatás" gombot:
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}");
}
}
Vizsgálja meg a kimenetet. Láthatja, hogy az egyes sorok feldolgozása az első mezőben szereplő szöveg értékének összehasonlításával történik. Az előző minta hasonló módon hozható létre az == operátorral annak ellenőrzésére, hogy két string érték egyenlő-e. A változók állandóval való összehasonlítása alapvető építőelem a mintaegyeztetéshez. Vizsgáljuk meg a mintaegyeztetés részét képező építőelemeket.
Enumerációs egyezések
A mintamegfeleltetés másik gyakori felhasználási módja egy típus értékeinek egyeztetése enum . Ez a következő minta feldolgozza a bemeneti rekordokat egy tömb létrehozásához, ahol az első érték egy enum olyan érték, amely megad egy befizetést vagy kifizetést. A második érték a tranzakció értéke. A működéshez nyomja le a "Futtatás" gombot:
Figyelmeztetés
Ne másold és illeszd be. Az interaktív ablakot alaphelyzetbe kell állítani a következő minták futtatásához. Ha hibát követ el, az ablak lefagy, és frissítenie kell a lapot a folytatáshoz.
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
}
Az előző példa egy utasítást if is használ, hogy ellenőrizze a enum kifejezés értékét. A mintamegfeleltetés egy másik formája egy switch kifejezést használ. Vizsgáljuk meg ezt a szintaxist, és hogy hogyan használhatja.
Teljes egyezések a(z) switch értékével
Az utasítások sorozata if számos feltételt tesztelhet. A fordító azonban nem tudja megállapítani, hogy egy if utasítássorozat kimerítő-e, vagy hogy a későbbi if feltételek a korábbi feltételek által lefedettek-e. A switch kifejezés biztosítja, hogy mindkét tulajdonság teljesüljön, ami kevesebb hibát eredményez az alkalmazásokban. Próbáljuk ki és kísérletezzünk. Másolja ki a következő kódot. Cserélje le az interaktív ablakban található két if utasítást a switch másolt kifejezésre. A kód módosítása után az interaktív ablak tetején található "Futtatás" gombra kattintva futtassa az új mintát.
currentBalance += transaction switch
{
(TransactionType.Deposit, var amount) => amount,
(TransactionType.Withdrawal, var amount) => -amount,
_ => 0.0,
};
A kód futtatásakor láthatja, hogy a kód ugyanúgy működik. A felülfogás szemléltetéséhez rendezze újra a kapcsolókarokat az alábbi kódrészletben látható módon:
currentBalance += transaction switch
{
(TransactionType.Deposit, var amount) => amount,
_ => 0.0,
(TransactionType.Withdrawal, var amount) => -amount,
};
A kapcsolókarok átrendezése után nyomja le a "Futtatás" gombot. A fordító hibát ad ki, mert az ág minden értéknek megfelel _. Ennek eredményeképpen az utolsó kar TransactionType.Withdrawal soha nem fut. A fordító azt jelzi, hogy valami nincs rendben a kódban.
A fordító figyelmeztetést ad ki, ha a switch kifejezésben tesztelt kifejezés olyan értékeket tartalmazhat, amelyek nem egyeznek egyetlen kapcsolókarhoz sem. Ha egyes értékek nem egyeznek meg egy feltétellel, a switch kifejezés nem teljes. A fordító figyelmeztetést is ad, ha a bemenet egyes értékei nem egyeznek a kapcsolókarok egyikével sem. Ha például eltávolítja a sort a _ => 0.0, elemmel, bármilyen érvénytelen érték nem egyezik. Futási időben ez nem sikerülne. Miután telepítette a .NET SDK-t, és programokat készített a környezetében, tesztelheti ezt a viselkedést. Az online felület nem jelenít meg figyelmeztetéseket a kimeneti ablakban.
Típusminták
Az oktatóanyag befejezéséhez vizsgáljuk meg még egy építőelemet a mintaegyezéshez: a típusmintát. A típusminta futtatáskor tesztel egy kifejezést, és ellenőrzi, hogy a megadott típus-e. Akár is kifejezést, akár switch kifejezést használhat típusteszt során. Módosítsa az aktuális mintát két módon. Először is, a tuple helyett hozzunk létre Deposit és Withdrawal rekordtípusokat, amelyek a tranzakciókat képviselik. Adja hozzá a következő deklarációkat az interaktív ablak alján:
public record Deposit(double Amount, string description);
public record Withdrawal(double Amount, string description);
Ezután adja hozzá ezt a metódust a metódus után a Main szöveg elemzéséhez és rekordsorozat visszaadásához:
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;
}
}
Végül cserélje le a foreach metódus ciklusát Main a következő kódra:
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}");
}
Ezután nyomja le a "Futtatás" gombot az eredmények megtekintéséhez. Ez a végleges verzió egy típuson teszteli a bemenetet.
A mintaegyeztetés szókészletet biztosít egy kifejezés jellemzőivel való összehasonlításához. A minták tartalmazhatják a kifejezés típusát, a típusértékeket, a tulajdonságértékeket és azok kombinációit. A kifejezések mintával való összehasonlítása egyértelműbb lehet, mint a több if összehasonlítás. Megismerkedett néhány olyan mintával, amelyet a kifejezések egyeztetéséhez használhat. Az alkalmazásokban a mintaegyeztetés számos más módon is használható. Először látogasson el a .NET webhelyre a .NET SDK letöltéséhez, hozzon létre egy projektet a gépen, és folytassa a kódolást. A C# mintaegyeztetéséről az alábbi cikkekben olvashat bővebben: