Es gibt schon diverse Klassen zur Aufnahme von Objektmengen. Aber tatsächlich fällt Microsoft immer noch etwas ein, was zu ergänzen gibt.
Neu in .NET 9.0 ist:
Klasse OrderedDictionary<T,T>
Klasse ReadOnlySet<T>
Remove() in der Klasse PriorityQueue
Neue Create()-Überladung in der Klasse SearchValues
Verbesserte Debugger-Ansicht für Dictionary-Klassen
Seit .NET Framework 2.0 und .NET Core 1.0 gibt es die Klasse System.Collections.Specialized.OrderedDictionary zum Abspeichern von Name-Wert-Paaren mit automatischer Sortierung nach dem Schlüssel und schnellem Auffinden eines Elements anhand des Schlüssels. Die Add()-Methode erwartet dabei zwei beliebige .NET-Objekte.
Nun in .NET 9.0 führt Microsoft endlich auch eine generische Variante von OrderedDictionary<T,T> im Namensraum System.Collections.Generic ein, mit der man den Typ für Schlüssel und Wert festzurren kann (Listing 1).
Listing 1: Neue Klasse OrderedDictionary<T,T>
public void GenericOrderedDictionary()
{
CUI.Demo(nameof(GenericOrderedDictionary));
OrderedDictionary<string, int> d = new()
{
["www.IT-Visions.de"] = 1996,
["www.dotnet7.de"] = 2022,
["www.dotnet8.de"] = 2023,
["www.dotnet-lexikon.de"] = 2000,
};
d.Add("www.dotnet9.de", 2024);
d.RemoveAt(1);
d.Insert(0, "www.dotnetframework.de", 2000);
foreach (KeyValuePair<string, int> entry in d)
{
Console.WriteLine(entry);
}
}
Das Listing 1 liefert diese Ausgabe:
[www.dotnetframework.de, 2000]
[www.IT-Visions.de, 1996]
[www.dotnet8.de, 2023]
[www.dotnet-lexikon.de, 2000]
[www.dotnet9.de, 2024]
.NET 9.0 bietet eine weitere neue Mengenklasse: ReadOnlySet<T>. Wie bei Sets üblich, sind in der Mengenklasse ReadOnlySet<T> keine Duplikate erlaubt (Abb. 1). Anders als bei HashSet<T> können Entwicklerinnen und Entwickler den Inhalt von ReadOnlySet<T> nicht verändern. Zur Konstruktion von ReadOnlySet<T> wird eine Menge in Form eines Objekts mit der Schnittstelle ISet<T> gebraucht, also zum Beispiel HashSet<T> (Listing 2).
Abb. 1: Ausgabe des Listings 2
Listing 2: Neue Klasse ReadOnlySet<T>
public void ReadOnlySet()
{
CUI.Demo();
CUI.H1("HashSet<T> erlaubt Hinzufügen/Löschen");
HashSet<string> set1 = new()
{
"www.IT-Visions.de",
"www.dotnet7.de",
"www.dotnet8.de",
"www.dotnet9.de",
"www.dotnet9.de",
"www.dotnettraining.de",
};
var r = set1.Add("www.dotnet9.de");
Console.WriteLine(r ? "URL neu" : "URL schon vorhanden");
set1.Remove("www.dotnet7.de");
foreach (var url in set1)
{
Console.WriteLine...