.NET 7’deki yenilikler [5]: C# 11 ile Kalıpları ve Dilim Kalıplarını Listeleme

Womanne

Member
C#’ın en son sürümlerinde olduğu gibi (sürüm 7.0’dan beri), Microsoft, C# 11’de bu sefer kontrol listeleri (liste deseni) ve alt kümeleri ayıklama (dilim deseni) dahil olmak üzere genişletilmiş model eşleştirmeye sahiptir.







Dr Holger Schwichtenberg, güvenlikle ilgili son derece kritik alanlarda bile yenilik ve deneyim odaklı yazılım geliştirme sunan MAXIMAGO’da Baş Teknoloji Uzmanıdır. Aynı zamanda, çok sayıda orta ölçekli ve büyük şirketi yazılım geliştirme ve işletim konusunda 38 tanınmış uzmanla danışmanlık ve eğitimle destekleyen uzman ağı www.IT-Visions.de’nin başkanıdır.







Ayakta iken .. herhangi bir sayıda öğe ve bir alt çizgi için _ bir nesne için.


Aşağıdaki yöntem (tamsayı dizisi ve tamsayı listesi parametreleriyle iki varyantta), bir sayı kümesinin 1 ve 2 ile mi yoksa yalnızca 1 ile mi başladığını kontrol eder ve buna göre 0 ile 4 arasındaki değerleri döndürür:


public string CheckList(int[] values)
=> values switch
{
[1, 2, .., 10]
=> "Liste beginnt mit 1 und 2 und endet mit 10",
[1, 2] => "Liste besteht aus 1 und 2",
[1, _] => "Liste beginnt mit 1, " +
"es kommt danach noch genau ein Element",
[1, ..] => "Liste beginnt mit 1, danach noch mehrere Elemente",
[_] => "Liste aus einem Element, beginnt nicht mit 1",
[..] => "Liste aus mehreren Elementen, beginnt nicht mit 1"
};

public string CheckList(List<int> values)
=> values switch
{
[1, 2, .., 10]
=> "Liste beginnt mit 1 und 2 und endet mit 10",
[1, 2] => "Liste besteht aus 1 und 2",
[1, _] => "Liste beginnt mit 1, " +
"es kommt danach noch genau ein Element",
[1, ..] => "Liste beginnt mit 1, " +
"danach noch mehrere Elemente",
[_] => "Liste aus einem Element, beginnt nicht mit 1",
[..] => "Liste aus mehreren Elementen, beginnt nicht mit 1"
};


Aşağıdaki örnek çağrılar için, onlardan sonra adlandırılan dönüş değerlerini alırsınız:


Console.WriteLine(CheckList(new[] { 1, 2, 10 }));
// "Liste beginnt mit 1 und 2 und endet mit 10"

Console.WriteLine(CheckList(new[] { 1, 2, 7, 3, 10 }));
// "Liste beginnt mit 1 und 2 und endet mit 10"

Console.WriteLine(CheckList(new[] { 1, 2 }));
// "Liste besteht aus 1 und 2"

Console.WriteLine(CheckList(new[] { 1, 3 }));
// "Liste beginnt mit 1, es kommt danach noch genau ein Element"

Console.WriteLine(CheckList(new[] { 1, 2, 5 }));
// "Liste beginnt mit 1, danach noch mehrere Elemente"

Console.WriteLine(CheckList(new[] { 3 }));
// "Liste aus einem Element, beginnt nicht mit 1"

Console.WriteLine(CheckList(new[] { 3, 5, 6, 7 }));
// "Liste aus mehreren Elementen, beginnt nicht mit 1"

Console.WriteLine(CheckList(new[] { 3, 4 }));
// "Liste aus mehreren Elementen, beginnt nicht mit 1"


Console.WriteLine(CheckList(new List<int> { 1, 2, 10 }));
// "Liste beginnt mit 1 und 2 und endet mit 10"

Console.WriteLine(CheckList(new List<int> { 1, 2, 7, 3, 10 }));
// "Liste beginnt mit 1 und 2 und endet mit 10"

Console.WriteLine(CheckList(new List<int> { 1, 2 }));
// "Liste besteht aus 1 und 2"

Console.WriteLine(CheckList(new List<int> { 1, 3 }));
// "Liste beginnt mit 1, es kommt danach noch genau ein Element"

Console.WriteLine(CheckList(new List<int> { 1, 2, 5 }));
// "Liste beginnt mit 1, danach noch mehrere Elemente"

Console.WriteLine(CheckList(new List<int> { 3 }));
// "Liste aus einem Element, beginnt nicht mit 1"

Console.WriteLine(CheckList(new List<int> { 3, 5, 6, 7 }));
// "Liste aus mehreren Elementen, beginnt nicht mit 1"

Console.WriteLine(CheckList(new List<int> { 3, 4 }));
// "Liste aus mehreren Elementen, beginnt nicht mit 1"



Bir kümeden (bölüm şablonu) ayrı öğeleri seçmek için şablondaki değişken adlarını kullanabilirsiniz. ExtractValue() bir sayı kümesinden bir karakter dizisi döndürür:


/// <summary>
/// Slice Pattern
/// </summary>
public string ExtractValue(int[] values)
=> values switch
{
[1, var middle, _] =>
$"Mittlere Zahl von 3 Zahlen (Beginn 1): " +
"{String.Join(", ", middle)}",
[_, var middle, _] =>
$"Mittlere Zahl von 3 Zahlen (Beginn beliebig): "+
"{String.Join(", ", middle)}",
[.. var all] => $"Alle Zahlen: {String.Join(", ", all)}"



İşte teslim edilecek çağrılar ExtractValue() aşağıdaki sonuçlar:


Console.WriteLine(ExtractValue(new[] { 1, 2, 6 }));
// "Mittlere Zahl von 3 Zahlen (Beginn 1): 2"

Console.WriteLine(ExtractValue(new[] { 3, 4, 5 }));
// "Mittlere Zahl von 3 Zahlen (Beginn beliebig): 4"

Console.WriteLine(ExtractValue(new[] { 2, 5, 6 }));
// "Mittlere Zahl von 3 Zahlen (Beginn beliebig): 5"

Console.WriteLine(ExtractValue(new[] { 1, 2, 5, 6 }));
// "Alle Zahlen: 1, 2, 5, 6"

Console.WriteLine(ExtractValue(new[] { 2, 5, 6, 7 }));
// "Alle Zahlen: 2, 5, 6, 7"



Değişkenden önce iki nokta üst üste ekleme (.. var middle) alt küme (dilim) birden çok öğeyle eşleşir. İşte bir değişken ExtractValues():


public string ExtractValues(int[] values)
=> values switch
{
[1, .. var middle, _] =>
$"Mittlere Zahlen: {String.Join(", ", middle)}",
[.. var all] =>
$"Alle Zahlen: {String.Join(", ", all)}"
};
}



İşte teslim edilecek çağrılar ExtractValues() aşağıdaki sonuçlar:


Console.WriteLine(ExtractValues(new[] { 1, 2, 5, 6 }));
// "Mittlere Zahlen (Beginn 1): 2, 5"

Console.WriteLine(ExtractValues(new[] { 1, 2, 6 }));
// "Mittlere Zahlen (Beginn 1): 2"

Console.WriteLine(ExtractValues(new[] { 2, 5, 6, 7 }));
// "Alle Zahlen: 2, 5, 6, 7"

Console.WriteLine(ExtractValues(new[] { 2, 5, 6 }));
// "Alle Zahlen: 2, 5, 6"



List modeli, özelliği olan tüm tiplerle çalışır. Length VEYA Count bir indeksleyicinin yanı sıra (name×) Sahip olmak. Kesit modeli için, indeksleyicinin girdi olarak bir Range nesnesini desteklemesi veya liste tipinin bir Range nesnesini desteklemesi gerekir. Slice()-İki tamsayı parametreli yöntem. Bu gereksinimler arayüzdekiler içindir IEnumerable basierenden Miktar türleri henüz genel olarak sağlanmamıştır. Microsoft geri bildirim istiyor

Dilimli model için pratik örnek


aşağıdaki yapı Autor bir yöntem sunar ExtractTitleAndSurname() adının bölümlerini ayıklamak için. Gönderdiği bir karakter dizisini alır Split() boşluklara ayrılmıştır. Daha sonra unvan ve soyadı ayıklanır. ToString() başlık ve soyadını bir JSON dizesi olarak döndürür.

C# 11.0’dan önce ve C# 11.0’dan beri, bu tür çıkarma için normal ifadeler dahil başka seçenekler vardı, ancak bunlar burada daha kafa karıştırıcı.


struct Autor : IAutor
{
public required int ID;
public string Name { get; set; }
public Autor() { }

private (string Titel, string Surname)
ExtractTitleAndSurname(string fullname)
=> fullname.Split(" ") switch // Slice Pattern
{
["Prof.", "Dr.", var nachname] =>
("Professor Doktor", nachname),
["Dr.", var nachname] => ("Doktor", nachname),
["Prof.", var nachname] => ("Professor", nachname),
["Prof.", "Dr.", _, .. var all] =>
("Professor Doktor", String.Join(" ", all)),
["Dr.", _, .. var all] =>
("Doktor", String.Join(" ", all)),
["Prof.", _, .. var all] =>
("Professor", String.Join(" ", all)),
[_, var nachname] => ("", nachname),
[var nachname] => ("", nachname),
[_, .. var all] => ("", String.Join(" ", all)),
_ => ("", "")
};

public override string ToString()
{
var json = $$"""
{
"Autor": {
"ID": "{{ID}}",
"Titel": "{{ExtractTitleAndSurname(Name)
.Titel}}",
"Nachname": "{{ExtractTitleAndSurname(Name)
.Surname}}"
}
}
""";
return json;
}
}



İstemci hangi örneklerini gösterir ExtractTitleAndSurname() kaplıdır:


Autor hs = new()
{ ID = 1, Name = "Dr. Holger Schwichtenberg" };
Console.WriteLine(hs);

Autor mm = new() { ID = 2, Name = "Jörg Krause" };
Console.WriteLine(mm);

Autor jf = new() { ID = 3, Name = "Dr. Fuchs" };
Console.WriteLine(jf);

Autor ol = new() { ID = 4, Name = "Lischke" };
Console.WriteLine(ol);

Autor rn = new()
{ ID = 5, Name = "Prof. Dr. Robin Nunkesser" };
Console.WriteLine(rn);

Autor leer = new() { ID = 6, Name = "" };
Console.WriteLine(leer);

Autor mehrereNamen = new()
{ ID = 7, Name = "Max Müller Lüdenscheidt" };
Console.WriteLine(mehrereNamen);



Kod aşağıdaki çıktıyı üretir:







Önceki kod çıkışı




(rm)



Haberin Sonu
 
Üst