Neu in .NET 9.0 [18]: Ergänzungen für SearchValues und PriorityQueue
Die Klasse SearchValues erhält eine weitere Überladung, und in PriorityQueue kann man nun Elemente an beliebiger Stelle aus einer Warteschlange entnehmen.
(Bild: Pincasso/Shutterstock.com)
- Dr. Holger Schwichtenberg
Die bereits in .NET 8.0 eingeführte Klasse System.Buffers.SearchValues besitzt nun bei der Methode Create() eine weitere Überladung, um nicht nur einzelne Zeichen, sondern ganze Zeichenketten schnell in einer anderen Zeichenkette zu suchen:
// In .NET 8.0 möglich
SearchValues<char> digits = SearchValues.Create("0123456789");
string text1 = "Hinweis: Der Buchstabe A hat in der ASCII-Tabelle den Wert 97.";
var positionDerErstenZiffer = text1.AsSpan().IndexOfAny(digits);
Console.WriteLine(positionDerErstenZiffer); // 59
// Ab .NET 9.0 möglich
SearchValues<string> artikel =
SearchValues.Create(["der", "die", "das"], StringComparison.OrdinalIgnoreCase);
string text2 = "Hinweis: Der Buchstabe A hat in der ASCII-Tabelle den Wert 97.";
var positionDesErstenArtikels = text2.AsSpan().IndexOfAny(artikel);
Console.WriteLine(positionDesErstenArtikels); // 9
Videos by heise
Elemente flexibel entfernen
Die PriorityQueue-Klasse, die bereits in .NET 6.0 eingeführt wurde, verfügt nun über eine Remove()-Methode, mit der Elemente entfernt werden können, auch wenn sie nicht an der Reihe sind. Remove() erweitert als Parameter das zu entfernende Element.
Remove() liefert drei Werte zurück: als Rückgabewert einen Boolean-Wert, der anzeigt, ob das Element vorhanden war und entfernt werden konnte. Im zweiten und dritten Methodenparameter kommt via out das entfernte Element zurück sowie seine Priorität.
Folgender Code zeigt den Einsatz der Methode Remove in der Klasse PriorityQueue:
public void PriorityQueueRemove()
{
CUI.Demo();
CUI.H2("PriorityQueue erstellen");
var q = new PriorityQueue<string, int>();
q.Enqueue("www.dotnet-doktor.de", 20);
q.Enqueue("www.dotnet7.de", 2);
q.Enqueue("www.IT-Visions.de", 10);
q.Enqueue("www.dotnet-lexikon.de", 30);
q.Enqueue("www.dotnet8.de", 3);
q.Enqueue("www.dotnet9.de", 1);
Console.WriteLine($"Elemente in der PriorityQueue: {q.Count}"); // 0
CUI.H2("Entferne vorhandenes Element aus der PriorityQueue mit Remove()");
bool b1 = q.Remove("www.dotnet7.de", out string e1, out int priority1); // .NET 7.0 raus, da Out of Support!!!
if (b1) Console.WriteLine($"Element {e1} mit Priorität {priority1} wurde entfernt!");
else Console.WriteLine("Element nicht gefunden");
Console.WriteLine($"Elemente in der PriorityQueue: {q.Count}"); // 0
CUI.H2("Versuch, nicht vorhandenes Element aus der PriorityQueue zu entfernen mit Remove()");
bool b2 = q.Remove("www.dotnet7.de", out string e2, out int priority2);
if (b2) Console.WriteLine($"Element {e2} mit Priorität {priority2} wurde entfernt!");
else Console.WriteLine("Element nicht gefunden");
CUI.H2($"Alle Elemente {q.Count} aus der Warteschlange holen mit Dequeue()"); // 5
var count = q.Count;
for (int i = 0; i < count; i++)
{
var current = q.Dequeue();
Console.WriteLine(i + ": " + current);
}
Console.WriteLine($"Verbliebene Elemente in der PriorityQueue: {q.Count}"); // 0
}
(Bild: Screenshot (Holger Schwichtenberg))
(Bild: coffeemill/123rf.com)
Das nächste LTS-Release steht an: Die Online-Konferenz betterCode() .NET 10.0 am 18. November 2025 – ausgerichtet von iX und dpunkt.verlag in Kooperation mit IT-visions.de – präsentiert die wichtigsten Neuerungen. Dazu zählen die Updates im .NET 10.0 SDK sowie in C# 14.0, ASP.NET Core 10.0, Blazor 10.0, Windows Forms 10.0, WPF 10.0, WinUI 3, .NET MAUI 10.0 und die Integration von Künstlicher Intelligenz in .NET-Anwendungen.
Das Programm ist noch nicht veröffentlicht – bis dahin sind vergünstigte Blind-Bird-Tickets bereits im Online-Shop erhältlich. Das Vorjahresprogramm lässt sich im Archiv einsehen.
(rme)