Neu in .NET 6 [11]: Standardparameter für FirstOrDefault() und Co.

Einige LINQ-Operationen bieten nun einen neuen Parameter, mit dem man einen Wert setzen kann, wenn kein Element gefunden wurde.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

Einige LINQ-Operationen bieten nun einen neuen Parameter, mit dem man einen Wert setzen kann, wenn kein Element gefunden wurde.

Die Operationen FirstOrDefault(), SingleOrDefault() und LastOrDefault() gibt seit der ersten Version der Language Integrated Query (LINQ) in .NET Framework 3.5 im Jahr 2007. Sie liefern das erste, das einzige beziehungsweise das letzte (auf die optional anzugebende Bedingung) passende Element einer Liste. Wenn kein passendes Element gefunden wurde, lieferten sie bisher immer den Standardwert des jeweiligen Datentyps: 0 bei Zahlen, den 1.1.0001 bei Datumsangaben und null bei Referenztypen und Zeichenketten.

Neu in .NET 6 ist, dass man bei FirstOrDefault(), SingleOrDefault() und LastOrDefault() einen optionalen Standardwert angeben kann.

Im folgenden Codebeispiel, das aus einer Menge von Zufallszahlen im Wertebereich 0 bis 99 nach Zahlen unter 10 sucht, kann man durch Angabe von -1 als Standardwert somit unterscheiden, ob eine 0 gefunden wurde oder kein Wert. In letzterem Fall bekommt man die -1 statt wie bisher ebenfalls eine 0.

Random _rand = new Random(Guid.NewGuid().GetHashCode());
List<int> Zufallszahlen = Enumerable.Range(0, 100)
.Select(r => _rand.Next(0,100))
.OrderBy(x=>x).ToList();

var ErsteZahlUnter10 =
Zufallszahlen.FirstOrDefault(x => x < 10,-1);
Console.WriteLine(ErsteZahlUnter10);

var LetzteZahlUnter10 =
Zufallszahlen.LastOrDefault(x => x < 10, -1);
Console.WriteLine(LetzteZahlUnter10);

try
{
var EinzigeZahlUnter10 =
Zufallszahlen.SingleOrDefault(x => x < 10, -1);
Console.WriteLine(EinzigeZahlUnter10);
}
catch (System.InvalidOperationException ex)
when (ex.Message.Contains("more than one"))
{
Console.WriteLine("Es gab mehr als eine :-)");
}
()