Liste ve dilim örüntüleri

Tip

Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Desenler sizin için yeniyse desen eşleştirmeye genel bakış ile başlayın. Tam desteklenen tür ve dil kuralları için bkz. dil başvurusundaki liste desenleri .

Bir dizinin şekli , bir desenin gerektirdiği gözlemlenebilir özellikler kümesidir. Bu özellikler öğe sayısını, her öğe için veya bir bütün olarak öğe dizisi için yazılmış gereksinimleri ve belirli dizinlerdeki işaretleyici değerlerini içerebilir. Örneğin, bir şekil, 0 dizininde "Name" ile tam olarak iki öğe gerektirebilir veya bir ilk işaretleyici, bir son işaretleyici ve bunların arasında boş olmayan bir dizi gerektirebilir.

Liste düzeni, öğe sayısı gereksinimini sıralı konumlarda iç içe desenlerle birleştirerek şekli açıklar. Yalnızca desende yazılan gereksinimleri test eder: Bir öğe alt deseni karşılık gelen öğesini test ederken, dilim deseni eşleşmeyen öğelerin dizisine izin verebilir veya bunları test edebilir. Bu bölümleri, tam sayıda öğe ve işaretleyici değerleriyle eşleşmek, sabit konumlardaki değerleri yakalamak, eşleşmeyen bir orta bölüme izin vermek veya o orta bölüme iç içe bir desen uygulamak için kullanabilirsiniz.

Girdinin derleme zamanı türü, Length veya Count özelliği ile input[index] örneğinde olduğu gibi bir öğeyi konumuna göre alan indeksli öğe erişimi sağlıyorsa bir liste deseni seçin. Diziler, List<T>, dizeler ve span'lar yaygın örneklerdir. Derleyici, program çalışmadan önce bu gerekli üyeleri çözümlemesi gerektiğinden değişkenin bildirilen derleme zamanı türünden uygunluğu belirler. IEnumerable<T> Arabirim, çalışma zamanı nesnesi dizine eklenebilir bir koleksiyon olsa bile bu üyeler yerine tek başına numaralandırma sağlar.

Liste desenleri numaralandırma yerine uzunluk veya sayı ve dizine alınan öğe erişimi kullanır. Ortak yerleşik türler için eşleştirme, her öğeyi yinelemek yerine yalnızca desen tarafından adlandırılan konumları denetleyebilir. Bu işlemlerin maliyeti giriş türüne bağlıdır. Uzun bir koleksiyonu yinelemek zaman alabilir, bu nedenle karar belirli konumlar yerine rastgele sayıda öğeyi incelemeyi gerektirdiğinde bir döngü veya LINQ kullanın.

Tam bir şekille eşleştirin

Aşağıdaki yöntem iki sütunlu üst bilgiyi tanır:

static bool IsHeader(string[] columns) =>
    columns is ["Name", "Score"];

columns ifadesi, desen girdisidir. ["Name", "Score"] iki sabit desen içerir. Kesin liste deseni bir dilim deseni içermez, tam olarak iki öğe gerektirir ve iç içe geçmiş her deseni aynı indeksteki öğeye uygular. Bu desen, tam sayı ve iki işaretçi değerine sahip bir şekli açıklar: "Name" dizin 0'da ve "Score" dizin 1'de. İç içe öğe desenleri isteğe bağlıdır: Boş liste düzeni [] , öğe içermeyen bir diziyi açıklar ve eşleştirir.

Şekil, bir öğe sayısını belirli konumlardaki gereksinimlerle birleştirdiğinde bir liste deseni seçin. Yalnızca öğe sayısı önemliyse, veya Count gibi items is { Count: 0 }bir Length özellik deseni bu amacı daha doğrudan belirtir.

Herhangi bir öğe değeriyle eşleştirmek için atma kullanma

Aşağıdaki yöntem, kazananı ve üçüncü sıradaki bitiriciyi üç adlı bir bitiş sırasına göre okur:

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"
    };

var winner ve var thirdPlace desenlerinin her birinin bir değişken bildirmesi. Liste deseni eşleştiğinde C#, bu konumdaki eşleşen öğe değerini ilgili değişkene atar; böylece sonuçta thirdPlace ve winner kullanılabilir. Yok sayma deseni _ ikinci öğeyi kabul eder ve değerini yok sayar. Bu şekil tam olarak üç öğe gerektirir ve birinci ve üçüncü konumlara belirli bir anlam verir, ancak herhangi bir konumda belirli değerler gerektirmez.

Sabit konumların kararlı bir anlamı olduğunda bu formu seçin. Rastgele sayıda öğeyi incelemeniz, bir diziyi dönüştürmeniz, içinde arama yapmanız veya toplama gerçekleştirmeniz gerektiğinde döngü veya LINQ kullanın.

Dilimleme deseni ile geri kalan öğelere izin ver

Bu basitleştirilmiş örnekte, komut satırı ile --verbose başlayıp başka bağımsız değişkenler içerebilir ve giriş dosyası adıyla bittiği varsayılır. Aşağıdaki yöntem, son konumda dosya adına sahip şekilleri tanır ve bu değeri yakalar:

static string GetInputFile(string[] arguments) =>
    arguments switch
    {
        ["--verbose", .., var fileName] => $"Verbose processing: {fileName}",
        [.., var fileName] => $"Processing: {fileName}",
        [] => "No input file was provided"
    };

Dilim deseni.., ilk ve son öğe desenleri arasında sıfır veya daha fazla kalan öğeye izin verir. Liste düzeni en fazla bir dilim deseni içerebilir. İlk anahtar kolu en az iki öğe içeren bir şekli tanımlar: dizin 0'daki işaretçi "--verbose" , son konumdaki bir dosya adı ve aralarında eşleşmeyen bağımsız değişken sayısı. Bağımsız dilim, ortadaki argümanları test etmez. İkinci dal, boş olmayan herhangi bir şekli kabul eder ve son öğesini yakalar; boş desen ise öğe içermeyen bir diziyi işler.

Dilim, liste deseninin başında, ortasında veya sonunda görünebilir. Değişken uzunluklu bir dizi şeklin parçası olduğunda ancak yalnızca çevresindeki konumlarda öğe testlerine ihtiyaç duyulduğunda bunu kullanın. Her öğenin işlenmesi gerektiğinde normal yinelemeyi kullanın.

Bir dilime desen uygulayın

ile ..eşleşen parçaya başka bir desen uygulayabilirsiniz. Aşağıdaki yöntem, bir dizinin ile "BEGIN"başlayıp başlamadığını, ile "END"bitip bitmediğini ve aralarında en az bir öğe olup olmadığını test eder:

static bool HasContent(string[] entries) =>
    entries is ["BEGIN", .. { Length: > 0 }, "END"];

Dış desen, öncelikle "END" işaretçisinin 0 dizininde ve "BEGIN" işaretçisinin son dizinde olmasını gerektirir. Ardından özellik deseni { Length: > 0 } , dilimle eşleşen dizi için bir gereksinim ekler: En az bir öğe içermelidir. Bu gereksinimler birlikte şeklin tamamını açıklar. Desen, dilim içindeki öğelerin değerlerini test etmez.

Dilim alt desenini yalnızca orta bölümün kendisinin test edilmesi veya yakalanması gerektiğinde kullanın. Yalnızca sınır öğeleri önemliyse, düz .. daha basittir.

Ayrıca bakınız