C#: czym różni się First od FirstOrDefault

Stosowanie wyrażeń lambda i LINQ może w znaczący sposób skrócić kod.

Jednym z częściej używanych funkcji jest funkcja pozwalająca wybrać pierwszy element z kolekcji (może posortowanej wcześniej funkcją Sort(), może potraktowanej wyrażeniem Where()). Do wyboru mamy użycie funkcji First() lub FirstOrDefault(). Czym się różnią?

First() zwraca pierwszy argument z listy. Jeśli lista jest pusta, rzucany jest wyjątek.

FirstOrDefault() zwraca pierwszy argument z listy. Jeśli lista jest pusta, zwracany jest element domyślny.

A jaki to jest element domyślny?

Dla typów prymitywnych typu int – wartość domyślna to 0. Dla typów obiektowych – null.

Całość można łatwo przetestować. Zrobiłam sobie np. taki obiekcik, żeby za jednym zamachem sprawdzić zachowanie się na obiekcie, jak i na incie:

class IntWrapper
{
  public readonly int IntValue;
  public IntWrapper(int intValue)
  {
    IntValue = intValue;
  }
}

I kod testujący:

var list = new List<IntWrapper> {new IntWrapper(5), new IntWrapper(10), new IntWrapper(15)};
/*var result1 = (from r in list
              where r.IntValue.Equals(200)
              select r).First(); */ //exception!

var result2 = (from r in list
              where r.IntValue.Equals(200)
              select r).FirstOrDefault();//default value: null

var list2 = new List<int> { 5, 10, 15 };
/*var result3 = (from r in list2
              where r.Equals(200)
              select r).First();*/ //exception!

var result4 = (from r in list2
              where r.Equals(200)
              select r).FirstOrDefault();//default value: 0

Przydatny wpis? Postaw mi kawę :)

Dodaj komentarz

avatar
  Subscribe  
Powiadom o