Neu in .NET 9.0 [23]: LINQ-Operatoren AggregateBy() und Index()

In .NET 9.0 hat Microsoft in der Basisklassenbibliothek zwei neue Operatoren fĂĽr Language Integrated Query hinzugefĂĽgt.

vorlesen Druckansicht
Pfeil mit .NET

(Bild: Pincasso/Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Neben dem im letzten Beitrag vorgestellten CountBy() gibt es auch AggregateBy() und Index() als neue LINQ-Operatoren (Language Integrated Query) in .NET 9.0.

Der Dotnet-Doktor – Holger Schwichtenberg
Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Videos by heise

AggregateBy() vereinfacht eine Gruppierung mit dem Ziel der Aggregation wie einer. Aufsummierung. Folgender Code nutzt den neuen Operator:

/// <summary>
 /// AggregateBy() vereinfacht eine Gruppierung mit dem Ziel der Aufsummierung.
 /// Beispiel: Summierung der Punkte pro Team
 /// </summary>
 public void LINQ_AggregateBy()
 {
  CUI.Demo(nameof(LINQ_AggregateBy) + ": Summierung der Punkte pro Team");
  List<Person> personSet = GetData();
 
  // --------------------------- ALT
  CUI.H2("Alt mit GroupBy() + Select()");
 
  // Punkte aggregieren ALT
  var teamPointsOld = personSet
      .GroupBy(p => p.Team)
      .Select(group => new { Team = group.Key, PunkteSumme = group.Sum(p => p.Punkte) });
 
  AnsiConsole.Write(new BarChart()
.Width(60)
.AddItems(teamPointsOld, (item) => new BarChartItem(
   item.Team, item.PunkteSumme, Color.Cyan2)));
 
  // --------------------------- NEU
  CUI.H2("\nNeu mit AggregateBy()");
 
  // Punkte aggregieren NEU
  IEnumerable<KeyValuePair<string, int>> teamPointsNew = personSet.AggregateBy(
      p => p.Team,
      seed: 0,
      (PunkteSumme, p) => PunkteSumme + p.Punkte);
 
  AnsiConsole.Write(new BarChart()
    .Width(60)
    .AddItems(teamPointsNew, (item) => new BarChartItem(
      item.Key, item.Value, Color.Cyan1)));
 }

Der Code summiert die Punkte der Teams.

(Bild: Screenshot (Holger Schwichtenberg))

Index() liefert fĂĽr ein IEnumerable<T> ein Tupel mit dem laufenden Index (Integer, 0 bis n) und dem Wert zurĂĽck, der im folgenden Code eine Zeichenkette ist:

/// <summary>
 /// Index() liefert für ein IEnumerable<T> ein Tupel mit dem Wert und dem laufenden Index (0 bis n) zurück. Beispiel: Wörter in einer Zeichenkette werden durchnummeriert.
 /// </summary>
 public void LINQ_Index()
 {
  CUI.Demo(nameof(LINQ_Index) + ": Wörter in einer Zeichenkette werden durchnummeriert");
 
  string sourceText = """
    Das ist ein Testbeispiel, das einige Mal das Wort das enthält.
    """;
  IEnumerable<string> words = sourceText.Split(new char[] { ' ', '.', ',', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
 
  // --------------------------- ALT mit Select()
  CUI.H2("\nAlt mit Select()");
  IEnumerable<(int index, string wort)> wordIndexOld = words.Select((wort, index) => (index, wort));
  foreach ((int index, string wort) in wordIndexOld)
  {
   Console.WriteLine($"{index + 1} Wort: {wort}");
  }
 
  // --------------------------- NEU mit Index() liefert Tupel mit Index und Wert
  CUI.H2("\nNeu mit Index()");
  IEnumerable<(int Index, string Item)> wordIndexNew = words.Index();
  foreach ((int index, string wort) in wordIndexNew)
  {
   Console.WriteLine($"{index + 1} Wort: {wort}");
  }
 }

Der Code nummeriert die Wörter innerhalb einer Zeichenkette.

(Bild: Screenshot (Holger Schwichtenberg))

(rme)