I've searched around and haven't really found a clear answer as to when you'd want to use .First
and when you'd want to use .FirstOrDefault
with LINQ.
When would you want to use
.First
? Only when you'd want to catch the exception if no results where returned?var result = List.Where(x => x == "foo").First();
And when would you want to use
.FirstOrDefault
? When you'd always want the default type if no result?var result = List.Where(x => x == "foo").FirstOrDefault();
And for that matter, what about Take?
var result = List.Where(x => x == "foo").Take(1);
.First
will throw an exception when there are no results..FirstOrDefault
won't, it will simply return either null (reference types) or the default value of the value type. (e.g like0
for an int.) The question here is not when you want the default type, but more: Are you willing to handle an exception or handle a default value? Since exceptions should be exceptional,FirstOrDefault
is preferred when you're not sure if you're going to get results out of your query. When logically the data should be there, exception handling can be considered.Skip()
andTake()
are normally used when setting up paging in results. (Like showing the first 10 results, and the next 10 on the next page, etc.)Hope this helps.
First:
FirstOrDefault:
From: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
Another difference to note is that if you're debugging an application in a Production environment you might not have access to line numbers, so identifying which particular
.First()
statement in a method threw the exception may be difficult.The exception message will also not include any Lambda expressions you might have used which would make any problem even are harder to debug.
That's why I always use
FirstOrDefault()
even though I know a null entry would constitute an exceptional situation.Which one to use? It should be decided by the business logic, and not the fear of exception/programm failure.
For instance, If business logic says that we can not have zero transactions on any working day (Just assume). Then you should not try to handle this scenario with some smart programming. I will always use First() over such collection, and let the program fail if something else screwed up the business logic.
Code:
I would like to see others comments over this.
First of all,
Take
is a completely different method. It returns anIEnumerable<T>
and not a singleT
, so that's out.Between
First
andFirstOrDefault
, you should useFirst
when you're sure that an element exists and if it doesn't, then there's an error.By the way, if your sequence contains
default(T)
elements (e.g.null
) and you need to distinguish between being empty and the first element beingnull
, you can't useFirstOrDefault
..First() will throw an exception if there's no row to be returned, while .FirstOrDefault() will return the default value (
NULL
for all reference types) instead.So if you're prepared and willing to handle a possible exception,
.First()
is fine. If you prefer to check the return value for != null anyway, then.FirstOrDefault()
is your better choice.But I guess it's a bit of a personal preference, too. Use whichever makes more sense to you and fits your coding style better.