poniedziałek, 4 listopada 2019

Single, SingleOrDefault, First, FirstOrDefault

Tytuł posta to często spotykane pytanie rekrutacyjne, które w pełnej formie brzmi najczęściej:
Omów metody Single, SingleOrDefault, First, FirstOrDefault. Podaj różnice między nimi.
Pytanie, być może dla jednych proste, dla innych już niekoniecznie. O ile FirstOrDefault jest bardzo często wykorzystywane w kodzie o tyle z Single-* może być już różnie.

Zobaczmy na początek na metody Single or SingleOrDefault. Metoda ta oczekuje, że kolekcja będzie zawierała tylko jeden element.

Do rozważenie mamy 4 przypadki:
- kolekcja jest nullem

            List<string> collection = null;

            var singleOrDefault = collection.SingleOrDefault();
            var single = collection.Single();

W obu przypadkach zostanie rzucony wyjątek System.ArgumentNullException


- kolekcja zawiera 1 element

            var collection = new List<string> {"Value1"};

            var singleOrDefault = collection.SingleOrDefault();
            var single = collection.Single();

W obu przypadkach zostanie zwrócony pojedynczą wartość Value1


- kolekcja zawiera więcej niż 1 element

            var collection = new List<string> {"Value1", "Value2"};

            var singleOrDefault = collection.SingleOrDefault();
            var single = collection.Single();

W obu przypadkach otrzymamy błąd System.InvalidOperationException: 'Sequence contains more than one element'. 


- kolekcja jest pusta

            var collection = new List<string>();

            var singleOrDefault = collection.SingleOrDefault();
            var single = collection.Single();

Tu już robi się ciekawiej. W przypadku kolekcji pustej metoda Single zwróci wyjątek: System.InvalidOperationException: 'Sequence contains no elements' a metoda SingleOrDefault() - wartość domyślną:




Drugą grupę metod stanowi First i FirstOrDefault. Tu już sprawa wydaje się znacznie łatwiejsza, gdyż są to metody znacznie częściej goszczące w naszym kodzie.
Jak poprzednio rozpatrzmy 4 przypadki:

- kolekcja jest nullem

            List<string> collection = null;

            var firstOrDefault = collection.FirstOrDefault();
            var first = collection.First();

W obu przypadkach zostanie rzucony wyjątek System.ArgumentNullException


- kolekcja zawiera 1 element

            var collection = new List<string> { "Value1" };

            var firstOrDefault = collection.FirstOrDefault();
            var first = collection.First();

W obu przypadkach zostanie zwrócony pojedynczą wartość Value1


- kolekcja zawiera więcej niż 1 element

            var collection = new List<string> { "Value1", "Value2" };

            var firstOrDefault = collection.FirstOrDefault();
            var first = collection.First();

W obu przypadkach zostanie zwrócony pojedynczą wartość Value1 - chcemy pobrać pierwszy element, jeżeli kolekcja zawiera więcej i tak zawsze otrzymamy pierwszy.


- kolekcja jest pusta

            var collection = new List<string>();

            var firstOrDefault = collection.FirstOrDefault();
            var first = collection.First();


W tym przypadku dla metody FirstOrDefault zostanie zwrócony null, gdyż to wartość domyślna jeżeli kolekcja jest pusta. Metoda First rzuci wyjątkiem System.InvalidOperationException: 'Sequence contains no elements'



Brak komentarzy:

Prześlij komentarz