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.
(Bild: Pincasso/Shutterstock.com)
- 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.
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)));
}
(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}");
}
}
(Bild:Â Screenshot (Holger Schwichtenberg))
(rme)