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.
Tip
Ez a cikk az Alapismeretek szakasz része azon fejlesztők számára, akik már legalább egy programozási nyelvet ismernek, és c#-t tanulnak. Kezdje a mintaegyeztetés áttekintésével , ha a minták újak Önnek. A teljes támogatott típus- és nyelvi szabályokért tekintse meg a nyelvi referencia listamintáit .
A sorozat alakzata a mintázat által igényelt megfigyelhető tulajdonságok halmaza. Ezek a tulajdonságok magukban foglalhatják az elemek számát, az egyes elemekre vagy egész elemek sorozatára vonatkozó követelményeket, valamint adott indexek jelölőértékeit. Például előfordulhat, hogy egy alakzat pontosan két elemet igényel, ahol a "Name" a 0. indexen van, vagy megkövetelhet egy első jelölőt, egy utolsó jelölőt, valamint a köztük lévő nem üres sorozatot.
A listaminta egy alakzatot ír le úgy, hogy egy elemszám-követelményt beágyazott mintákkal kombinál rendezett pozícióban. Csak a mintában megírt követelményeket teszteli: Az elem alhálózata teszteli a megfelelő elemet, míg a szeletminta lehetővé teszi vagy tesztelheti az egyébként nem egyező elemek sorozatát. Ezekkel a részekkel pontos szám- és jelölőértékeket egyeztethet, rögzített pozícióban rögzítheti az értékeket, engedélyezheti a nem egyező középértékeket, vagy beágyazott mintát alkalmazhat erre a közepére.
Válasszon listamintát, ha a bemenet fordítási időben ismert típusa rendelkezik Count vagy Length tulajdonsággal és indexelt elemelérést biztosít, amely a pozíciója alapján kér le egy elemet, mint például a input[index] esetében. A tömbök, List<T>a sztringek és a spanok gyakori példák. A fordító a változó deklarált, fordítási idő típusú jogosultságát határozza meg, mert a program futtatása előtt fel kell oldania ezeket a szükséges tagokat. A IEnumerable<T> felület önmagában enumerálást biztosít a tagok helyett, még akkor is, ha a futtatókörnyezeti objektum indexelhető gyűjtemény.
A listaminták enumerálás helyett hossz vagy darabszám és indexelt elemhozzáférést használnak. A gyakori beépített típusok esetében az egyeztetés csak a minta által elnevezett pozíciókat tudja ellenőrizni, nem pedig minden elemen végigvezetni. Ezeknek a műveleteknek a költsége a bemeneti típustól függ. A hosszú gyűjtemények iterálása időt vehet igénybe, ezért használjon hurkot vagy LINQ-t, ha a döntéshez az elemek tetszőleges számának vizsgálatára van szükség a konkrét pozíciók helyett.
Pontos alakzat egyeztetése
A következő metódus felismer egy kétoszlopos fejlécet:
static bool IsHeader(string[] columns) =>
columns is ["Name", "Score"];
A columns kifejezés a minta bemenete.
["Name", "Score"] két állandó mintát tartalmaz. A pontos listaminta kihagy egy szeletmintát, pontosan két elemet igényel, és minden beágyazott mintát alkalmaz az ugyanazon indexben lévő elemre. Ez a minta egy pontos darabszámmal és két jelölőértékkel rendelkező alakzatot ír le: "Name" a 0. indexnél és "Score" az 1. indexnél. A beágyazott elemmintázatok nem kötelezők: Az üres listaminta, [], elemek nélküli sorozatot ír le, és arra illeszkedik.
Válasszon egy listamintát, ha az alakzat egyesít egy elemszámot a rendezett pozíciókra vonatkozó követelményekkel. Ha csak az elemek száma számít, akkor egy Length vagy Count egy tulajdonságminta, például items is { Count: 0 }a közvetlenebb szándékot állítja be.
Bármely elemértéknek megfelelő elvetés használata
A következő módszer egy három névből álló befejezési sorrendből olvassa be a győztest és a harmadik helyezettet:
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"
};
Az var winner egyes var thirdPlace minták változót deklarálnak. Ha a listaminta egyezik, a C# az adott pozícióban lévő egyező elemértéket rendeli hozzá a megfelelő változóhoz, így az eredmény használható winner és thirdPlace. Az elvetési minta _ elfogadja a második elemet, és elveti annak értékét. Ez az alakzat pontosan három elemet igényel, és az első és a harmadik pozíciót konkrét jelentéssel ruházza fel, de semmilyen helyzetben nem igényel különleges értékeket.
Akkor válassza ezt az űrlapot, ha a rögzített pozíciók jelentése stabil. Használjon hurkot vagy LINQ-t, ha tetszőleges számú elem vizsgálatát, sorozat átalakítását, teljes keresését vagy összesítést kell végrehajtania.
Szeletmintával rendelkező fennmaradó elemek engedélyezése
Ebben az egyszerűsített példában a parancssorok más argumentumokkal --verbose kezdődhetnek és tartalmazhatnak, és feltételezik, hogy a bemeneti fájl nevével végződnek. Az alábbi módszer felismeri az utolsó helyen lévő fájlnévvel rendelkező alakzatokat, és rögzíti az értéket:
static string GetInputFile(string[] arguments) =>
arguments switch
{
["--verbose", .., var fileName] => $"Verbose processing: {fileName}",
[.., var fileName] => $"Processing: {fileName}",
[] => "No input file was provided"
};
A szeletminta.. nulla vagy több fennmaradó elemet tesz lehetővé az első és az utolsó elemminta között. A listaminta legfeljebb egy szeletmintát tartalmazhat. Az első kapcsolókar egy legalább két elemet tartalmazó alakzatot ír le: a 0. indexnél lévő jelölőt "--verbose" , az utolsó pozícióban lévő fájlnevet és a köztük lévő tetszőleges számú nem egyező argumentumot. Az önálló szelet nem teszteli ezeket a középső argumentumokat. A második kar minden nem létező alakzatot elfogad, és rögzíti az utolsó elemét, míg az üres minta elem nélküli sorrendet kezel.
A szeletek a listaminta elején, közepén vagy végén is megjelenhetnek. Akkor használja, ha egy változó hosszúságú sorozat az alakzat része, de csak a környező pozíciókhoz van szükség elemtesztre. Használjon szokásos iterációt, amikor minden elem feldolgozásra szorul.
Minta alkalmazása egy szeletre
Alkalmazhat egy másik mintát a megfelelő ..részre. Az alábbi módszer azt vizsgálja, hogy egy tömb a következővel "BEGIN"kezdődik, végződik-e "END", és van-e közöttük legalább egy elem:
static bool HasContent(string[] entries) =>
entries is ["BEGIN", .. { Length: > 0 }, "END"];
A külső minta először megköveteli a "END" jelölőt a 0. indexnél, valamint a "BEGIN" jelölőt az utolsó indexnél. A tulajdonságminta { Length: > 0 } ezután hozzáad egy követelményt a szelettel egyeztetett sorozathoz: Legalább egy elemet tartalmaznia kell. Ezek a követelmények együttesen írják le a teljes alakzatot. A minta nem teszteli a szeleten belüli elemek értékeit.
Csak akkor használjon szelet részmintát, ha magát a középső részt kell ellenőrizni vagy rögzíteni. Ha csak a határolóelemek számítanak, az egyszerű .. egyszerűbb.