Dzisiaj króciutka notka, ale mam nadzieję, że komuś przyda się. Załóżmy, że mamy kolekcję zawierającą np. DateTime. Naszym zadaniem jest zwrócenie maksymalnej wartości. Za pomocą LINQ łatwo to zrobić:
DateTime[] dateTimeList=/.../; DateTime maxValue = dateTimeList.Max();
Niestety, w sytuacji gdy kolekcja zawiera 0 elementów dostaniemy wyjątek: “Sequence contains no elements”. Potrzebujemy funkcji MaxOrDefault, która niestety nie istnieje. Mamy do dyspozycji FirstOrDefault, SingleOrDefault, ale nie ma odpowiednika MaxOrDefault. Można oczywiście sprawdzać na początku czy kolekcja zawiera jakiś element:
DateTime[] dateTimeList=new DateTime[0]; DateTime maxValue; if (dateTimeList.Any()) maxValue = dateTimeList.Max(); else Console.WriteLine("Kolekcja nie ma elementow.");
Rozwiązanie oczywiście bardzo nieeleganckie. W LINQ istnieje funkcja, która nazywa się DefaultIfEmpty. Zwraca ona domyślny element (można również przekazać własną domyślną wartość), jeśli sekwencja jest pusta. Takim sposobem, możemy zwracać np. NULL, gdy kolekcja jest pusta lub maksymalną wartość jeśli jakieś elementy znajdują tam się.
DateTime[] dateTimeList = new DateTime[0]; DateTime? maxValue = null; maxValue = dateTimeList.Select(d=>(DateTime?)d).DefaultIfEmpty().Max(); if (maxValue == null) Console.WriteLine("Kolekcja nie ma elementow.");
Można również pokusić się o napisanie metody rozszerzającej aby mieć w swoim framework’u po prostu MaxOrDefault().