Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tip
Tento článek je součástí části Základy pro vývojáře, kteří už znají aspoň jeden programovací jazyk a učí se jazyk C#. Začněte přehledem porovnávání vzorů , pokud jsou pro vás vzory nové. Úplná pravidla pro podporované typy a jazyky najdete v části vzory seznamů v referenční příručce k jazyku.
Tvar sekvence je sada pozorovatelných vlastností, které vzorec vyžaduje. Tyto vlastnosti mohou zahrnovat počet prvků, požadavky napsané pro každý prvek nebo posloupnost prvků jako celek a hodnoty značek v konkrétních indexech. Například obrazec může vyžadovat přesně dva prvky s indexem "Name" 0 nebo může vyžadovat první značku, poslední značku a neprázdnou sekvenci mezi nimi.
Vzor seznamu popisuje obrazec kombinací požadavku na počet prvků s vnořenými vzory na seřazených pozicích. Testuje pouze požadavky napsané v modelu: Podpattern prvku testuje svůj odpovídající prvek, zatímco vzor řezu může povolit nebo testovat sekvenci jinak nesečtených prvků. Tyto části můžete použít k nastavení přesného počtu a hodnot markerů, k zachycení hodnot na pevných pozicích, k povolení prostřední části bez shody nebo k použití vnořeného vzoru na tuto prostřední část.
Zvolte vzor seznamu, když typ kompilace vstupu poskytuje Length nebo Count vlastnost a indexovaný přístup k elementu, který načte prvek podle jeho pozice, jako v input[index]. Mezi běžné příklady patří pole, List<T>řetězce a rozsahy. Kompilátor určuje způsobilost podle deklarovaného typu proměnné známého v době kompilace, protože tyto požadované členy musí určit ještě před spuštěním programu. Rozhraní IEnumerable<T> samo o sobě poskytuje výčet místo těchto členů, i když je objekt runtime indexovatelnou kolekcí.
Vzory seznamů používají místo výčtu délku nebo počet a indexovaný přístup k prvkům. U běžných předdefinovaných typů může porovnávání kontrolovat pouze pozice pojmenované vzorem, nikoli iterovat všemi prvky. Náklady na tyto operace závisí na typu vstupu. Iterace dlouhé kolekce může nějakou dobu trvat, proto použijte smyčku nebo LINQ, pokud rozhodnutí vyžaduje prozkoumání libovolného počtu prvků, nikoli konkrétních pozic.
Porovnat s přesným tvarem
Následující metoda rozpozná záhlaví se dvěma sloupci:
static bool IsHeader(string[] columns) =>
columns is ["Name", "Score"];
Výraz columns je vstup vzoru.
["Name", "Score"] obsahuje dva konstantní vzory. Přesný vzor seznamu vynechá řez, vyžaduje přesně dva prvky a každý vnořený vzor použije na prvek ve stejném indexu. Tento vzor popisuje tvar s přesným počtem a dvěma hodnotami markerů: "Name" na indexu 0 a "Score" na indexu 1. Vnořené vzory elementů jsou volitelné: Prázdný vzor [] seznamu popisuje a odpovídá sekvenci bez prvků.
Vyberte vzor seznamu, pokud tvar kombinuje počet prvků s požadavky na určených pozicích. Pokud záleží jen na počtu prvků, vzor vlastnosti Length nebo Count, například items is { Count: 0 }, vyjadřuje tento záměr přímočařeji.
Použití odkládací proměnné pro porovnání s libovolnou hodnotou prvku
Následující metoda načte vítěze a závodníka na třetím místě z tříčlenného pořadí v cíli:
static string GetAnnouncements(List<string> finishingOrder) =>
finishingOrder switch
{
[var winner, _, var thirdPlace] =>
$"Winner: {winner}; third place: {thirdPlace}",
_ => "A complete three-runner result isn't available"
};
Vzory var winner a var thirdPlace deklarují proměnnou. Když se vzor seznamu shoduje, přiřadí jazyk C# odpovídající hodnotu elementu na dané pozici odpovídající proměnné, aby výsledek mohl použít winner a thirdPlace. Vzor discard _ odpovídá druhému prvku a jeho hodnotu zahodí. Tento obrazec vyžaduje přesně tři prvky a dává první a třetí pozici specifický význam, ale nevyžaduje konkrétní hodnoty na žádné pozici.
Tuto formu vyberte, pokud pevné pozice mají stabilní význam. Smyčku nebo LINQ použijte, když potřebujete zkontrolovat libovolný počet prvků, transformovat sekvenci, prohledávat v ní nebo provádět agregaci.
Povolit zbývající prvky odpovídající vzoru výřezu
V tomto zjednodušeném příkladu může příkazový řádek začínat --verbose a obsahovat další argumenty a předpokládá se, že končí názvem vstupního souboru. Následující metoda rozpozná obrazce s názvem souboru na poslední pozici a zachytí danou hodnotu:
static string GetInputFile(string[] arguments) =>
arguments switch
{
["--verbose", .., var fileName] => $"Verbose processing: {fileName}",
[.., var fileName] => $"Processing: {fileName}",
[] => "No input file was provided"
};
..
umožňuje, aby mezi vzory prvního a posledního prvku bylo nula nebo více zbývajících prvků. Vzor seznamu může obsahovat maximálně jeden vzor řezu. První rameno přepínače popisuje obrazec s alespoň dvěma prvky: značku "--verbose" indexu 0, název souboru na poslední pozici a libovolný počet chybějících argumentů mezi nimi. Samostatný výřez netestuje tyto prostřední argumenty. Druhé rameno přijímá libovolný neprázdný tvar a zachytí jeho poslední prvek, zatímco prázdný vzor zpracuje posloupnost bez prvků.
Výřez se může objevit na začátku, uprostřed nebo na konci vzoru seznamu. Tuto funkci použijte, pokud je sekvence proměnné délky součástí obrazce, ale pouze okolní pozice vyžadují testy prvků. Běžné iterace použijte, když každý prvek potřebuje zpracování.
Použití vzoru u řezu
Na část, která ..odpovídá , můžete použít jiný vzor . Následující metoda testuje, zda pole začíná prvkem "BEGIN", končí prvkem "END" a má mezi nimi alespoň jeden prvek:
static bool HasContent(string[] entries) =>
entries is ["BEGIN", .. { Length: > 0 }, "END"];
Vnější vzor nejprve vyžaduje značku "BEGIN" na indexu 0 a "END" na posledním indexu. Vzor vlastnosti { Length: > 0 } pak přidá požadavek na sekvenci, která odpovídá řezu: Musí obsahovat aspoň jeden prvek. Tyto požadavky dohromady popisují celý tvar. Tento vzor netestuje hodnoty prvků uvnitř slice.
Dílčí vzor řezu používejte pouze tehdy, když samotná prostřední část vyžaduje testování nebo zachycení. Pokud záleží pouze na okrajových prvcích, je jednodušší použít prosté ...