C# – Checking if a list is empty with LINQ

clinqlistnet

What's the "best" (taking both speed and readability into account) way to determine if a list is empty? Even if the list is of type IEnumerable<T> and doesn't have a Count property.

Right now I'm tossing up between this:

if (myList.Count() == 0) { ... }

and this:

if (!myList.Any()) { ... }

My guess is that the second option is faster, since it'll come back with a result as soon as it sees the first item, whereas the second option (for an IEnumerable) will need to visit every item to return the count.

That being said, does the second option look as readable to you? Which would you prefer? Or can you think of a better way to test for an empty list?

Edit @lassevk's response seems to be the most logical, coupled with a bit of runtime checking to use a cached count if possible, like this:

public static bool IsEmpty<T>(this IEnumerable<T> list)
{
    if (list is ICollection<T>) return ((ICollection<T>)list).Count == 0;

    return !list.Any();
}

Best Answer

You could do this:

public static Boolean IsEmpty<T>(this IEnumerable<T> source)
{
    if (source == null)
        return true; // or throw an exception
    return !source.Any();
}

Edit: Note that simply using the .Count method will be fast if the underlying source actually has a fast Count property. A valid optimization above would be to detect a few base types and simply use the .Count property of those, instead of the .Any() approach, but then fall back to .Any() if no guarantee can be made.