LINQ provides element operators which return a single element or a specific element from a collection. The elements operators are Single, SingleOrDefault, First, FirstOrDefault, Last, LastOrDefault.
Single
It returns a single specific element from a collection of elements if element match found. An exception is thrown, if none or more than one match found for that element in the collection.
SingleOrDefault
It returns a single specific element from a collection of elements if element match found. An exception is thrown, if more than one match found for that element in the collection. A default value is returned, if no match is found for that element in the collection.
List<int> data = new List<int> { 10, 20, 30, 40, 50 };
//Try to get element at specified position
Console.WriteLine(data.ElementAt(1)); //result:20
//Try to get element at specified position if exist, else returns default value
Console.WriteLine(data.ElementAtOrDefault(10)); //result:0, since default value is 0
Console.WriteLine(data.First()); //result:10
Console.WriteLine(data.Last()); //result:50
//try to get first element from matching elements collection
Console.WriteLine(data.First(d => d <= 20)); //result:10
//try to get first element from matching elements collection else returns default value
Console.WriteLine(data.SingleOrDefault(d => d >= 100)); //result:0, since default value is 0
//Try to get single element
// data.Single(); //Exception:Sequence contains more than one element
//Try to get single element if exist otherwise returns default value
// data.SingleOrDefault(); //Exception:Sequence contains more than one element
//try to get single element 10 if exist
Console.WriteLine(data.Single(d => d == 10)); //result:10
//try to get single element 100 if exist otherwise returns default value
Console.WriteLine(data.SingleOrDefault(d => d == 100)); //result:0, since default value is 0
First
- It returns first specific element from a collection of elements if one or more than one match found for that element. An exception is thrown, if no match is found for that element in the collection.
FirstOrDefault
- It returns first specific element from a collection of elements if one or more than one match found for that element. A default value is returned, if no match is found for that element in the collection.
When to use Single, SingleOrDefault, First and FirstOrDefault ?
- You should take care of following points while choosing Single, SingleOrDefault, First and FirstOrDefault:
- When you want an exception to be thrown if the result set contains many records, use Single or SingleOrDefault.
- When you want a default value is returned if the result set contains no record, use SingleOrDefault.
- When you always want one record no matter what the result set contains, use First or FirstOrDefault.
- When you want a default value if the result set contains no record, use FirstOrDefault.
Perfomance of SingleOrDefault and FirstOrDefault
- FirstOrDefault usually perform faster as compared SingleOrDefault, since these iterate the collection until they find the first match. While SingleOrDefault iterate the whole collection to find one single match.