.NET 7'de yeni [5]: C# 11 ile dilim ve dilim modellerini listeler

Womanne

Member
En son C sürümlerinde olduğu gibi (sürüm 7.0'dan), Microsoft modelin C# 11'deki yazışmalarını genişletti, bu sefer listeler listesi (liste desenleri) ve kısmi miktarların (çatlak modelleri) çıkarılması.










Holger Schwichtenberg, 53 ünlü uzmanla tavsiye ve eğitim yoluyla ve yazılımın geliştirilmesinde çok sayıda orta ve büyük şirketi destekleyen uzmanlar ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası uzman konferansındaki görünümleri, 90'dan fazla uzman kitabı ve 1.500'den fazla uzman makalesi sayesinde Holger Schwichtenberg, Almanya'daki .NET ve Web teknikleri için en iyi uzmanlardan biridir.







Standlar .. Herhangi bir sayıda öğe ve altı çizili _ Bir element için.



Aşağıdaki yöntem (bütün dizi türü ve bütünden kurnaz parametreli iki varyantta) 1 ve 2 ile bir miktar sayı veya sadece 1 başlangıçlı ve 0 ila 4 arasında değerler sunup sunmadığını kontrol edin:



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 için, arkada belirtilen dönüş değerleri:



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"



Modeldeki değişken adlarla birlikte bir kalabalığın (dilim dilim) ayrı ayrı unsurlarını da seçebilirsiniz. ExtractValue() Birçok numaradan bir dize sunar:





/// <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)}"



Burada görüşler 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şkenin önüne iki nokta konumlandırma (.. var middle) alt küme (dilim) birkaç öğeye karşılık gelir. İşte bir varyant ExtractValues():



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



Burada görüşler 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"



Liste modeli, bir mülkün her türü ile çalışır Length VEYA Count bir dizinci yanı sıra (name×) Sahip olmak. Dilim modeli söz konusu olduğunda, endeksleyici bir aralık nesnesini giriş olarak desteklemeli veya liste türü bir olmalıdır. Slice()-S iki tam parametreli yöntemi. Bu gereksinimler arayüzde olanlar içindir IEnumerable basierenden Mengent türleri henüz genel olarak verilmez. Microsoft geri bildirim istiyor

Dilim modeli için pratik örnek


Aşağıdaki yapı Autor Bir yöntem sunar ExtractTitleAndSurname() Adın bileşenlerini çıkarmak için. Bir ip alır Split() Mekanlarla oluşur. Böylece başlık ve soyadı çıkarılır. ToString() Başlığı ve soyadını Segni Json zinciri olarak atar.

İlk C# 11.0 vardı ve ayrıca bu durumda daha fazla karışık olan normal ifadeler de dahil olmak üzere C# 11.0'dan bu çıkarma için başka seçenekler sunuyor.



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



Müşteri hangi vakaları gösterir ExtractTitleAndSurname() Kapsanıyorlar:



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 baskıyı oluşturur:








Yukarıdaki kodun çıktısı




(RME)
 
Üst