Kolumne: .NETversum

Neue Möglichkeiten für Objektmengen in .NET 9.0

Neue Möglichkeiten für Objektmengen in .NET 9.0

Kolumne: .NETversum

Neue Möglichkeiten für Objektmengen in .NET 9.0


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

Klasse OrderedDictionary<T,T>

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]

Klasse ReadOnlySet<T>

.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).

wd_5_25_schwichtenberg_kolumne_teil1_1

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...