Search code examples
c#linqlinq-to-objects

Basic array Any() vs Length


I have a simple array of objects:

Contact[] contacts = _contactService.GetAllContacts();

I want to test if that method returns any contacts. I really like the LINQ syntax for Any() as it highlights what I am trying to achieve:

if(!contacts.Any()) return;

However, is this slower than just testing the length of the array?

if(contacts.Length == 0) return;

Is there any way I can find out what kind of operation Any() performs in this instance without having to go to here to ask? Something like a Profiler, but for in-memory collections?


Solution

  • There are two Any() methods: 1. An extension method for IEnumerable<T> 2. An extension method for IQueryable<T>

    I'm guessing that you're using the extension method for IEnumerable<T>. That one looks like this:

    public static bool Any<T>(this IEnumerable<T> enumerable)
    {
        foreach (var item in enumerable)
        {
            return true;
        }
    
        return false;
    }
    

    Basically, using Length == 0 is faster because it doesn't involve creating an iterator for the array.

    If you want to check out code that isn't yours (that is, code that has already been compiled), like Any<T>, you can use some kind of disassembler. Jetbrains has one for free - http://www.jetbrains.com/decompiler/