LINQ: Single vs. First

LINQ With C# (Portuguese)

I’ve witnessed and been involved in several discussions around the correctness or usefulness of the Single method in the LINQ API.

The most common argument is that you are querying for the first element on the result set and an exception will be thrown if there’s more than one element. The First method should be used instead, because it doesn’t throw if the result set has more than one item.

Although the documentation for Single states that it returns a single, specific element of a sequence of values, it actually returns THE single, specific element of a sequence of ONE value. When you use the Single method in your code you are asserting that your query will result in a scalar result instead of a result set of arbitrary length.

On the other hand, the documentation for First states that it returns the first element of a sequence of arbitrary length.

Imagine you want to catch a taxi. You go the the taxi line and catch the FIRST one, no matter how many are there.

On the other hand, if you go the the parking lot to get your car, you want the SINGLE one specific car that’s yours. If your “query” “returns” more than one car, it’s an exception. Either because it “returned” not only your car or you happen to have more than one car in that parking lot. In either case, you can only drive one car at once and you’ll need to refine your “query”.

3 Responses to LINQ: Single vs. First

  • Like other LINQ API methods that extract a scalar value from a sequence, Single has a companion SingleOrDefault.

  • Matthijs says:

    I am not sure whether or not this is a good thing or not. But I heard that First can be more efficient than Single because underwater, First will stop searching when it finds a matching element, while single will continue looking to ensure there is only one.

  • paulo says:

    Single and First exist for different purposes and efficiency has nothing to do with it.

    If you want just the first value, you should call First.

    If under normal conditions there should only be one value and the existence other than one value is an error condition, you should call Single.