FirstOrDefault
This C# method, part of System.Linq
, is almost the same as First()
. The difference is how FirstOrDefault()
handles empty collections.
If a collection is empty, FirstOrDefault
returns the default value for the type. The method internally checks if an element exists.
FirstOrDefault
exampleHere we show what happens when FirstOrDefault
is used on a non-empty collection, and then an empty collection. If a collection is empty, a default value is returned.
using System; using System.Linq; int[] test = { 1, 2 }; Console.WriteLine("FIRST OR DEFAULT: {0}", test.FirstOrDefault()); int[] test2 = new int[0]; Console.WriteLine("FIRST OR DEFAULT: {0}", test2.FirstOrDefault());FIRST OR DEFAULT: 1 FIRST OR DEFAULT: 0
Unlike FirstOrDefault
, First()
will throw an exception if there is no first value to be found. This makes First()
much more difficult to work with in most programs.
using System.Collections.Generic; using System.Linq; List<int> values = [10, 20, 30]; // This causes an exception as no value matches the predicate function. // There is no First value! var result = values.First(a => a > 50);Unhandled exception. System.InvalidOperationException: Sequence contains no matching element
The System.Linq
namespace is required to use FirstOrDefault
. The FirstOrDefault
method can be used on any type that implements IEnumerable
.
FirstOrDefault
is invoked, it returns the value of the first string
element in the List
.null
because the "query1" expression returned no elements.string
literal "Mouse" because that is the first element that matches the "where" clause in the query.FirstOrDefault
when called on an empty integer array.using System; using System.Collections.Generic; using System.Linq; // Part 1: this List has 3 elements. var list = new List<string>() { "Cat", "Rat", "Mouse" }; Console.WriteLine(list.FirstOrDefault()); // Part 2: this query produces no results so FirstOrDefault is null. var query1 = from element in list where element.Length > 10 select element; Console.WriteLine(query1.FirstOrDefault() == null); // Part 3: this query produces one result, so FirstOrDefault is a string. var query2 = from element in list where element.Length > 3 select element; Console.WriteLine(query2.FirstOrDefault()); // Part 4: this array has no elements, so FirstOrDefault is zero. int[] array = new int[0]; Console.WriteLine(array.FirstOrDefault());Cat True Mouse 0
The First()
and FirstOrDefault()
methods are extension methods. There are generic methods that accept (or infer) a type parameter that indicates what types it acts upon.
The default value for a value type is equal to all zero bits. And the default value for a reference type is the null
value.
First()
and FirstOrDefault
are ways to access the "best match" from a query expression that sorts and filters elements. They protect against invalid accesses.