基本数组Any()vs Length

Cod*_*gue 8 c# linq linq-to-objects

我有一个简单的对象数组:

Contact[] contacts = _contactService.GetAllContacts();
Run Code Online (Sandbox Code Playgroud)

我想测试该方法是否返回任何联系人.我非常喜欢LINQ语法,Any()因为它突出了我想要实现的目标:

if(!contacts.Any()) return;
Run Code Online (Sandbox Code Playgroud)

但是,这比测试阵列长度慢吗?

if(contacts.Length == 0) return;
Run Code Online (Sandbox Code Playgroud)

有什么方法可以找出Any()在这种情况下执行什么样的操作而不必去这里问?像Profiler这样的东西,但对于内存中的集合?

小智 6

有两种Any()方法:1.扩展方法IEnumerable<T> 2.扩展方法IQueryable<T>

我猜你正在使用扩展方法IEnumerable<T>.那个看起来像这样:

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

基本上,使用Length == 0更快,因为它不涉及为数组创建迭代器.

如果你想查看不属于你的代码(即已编译的代码),比如Any<T>,你可以使用某种反汇编程序.Jetbrains免费提供一个 - http://www.jetbrains.com/decompiler/


dec*_*cPL 6

我必须完全不同意其他答案。它当然不会迭代数组。它会稍微慢一些,因为它需要创建一个数组迭代器对象并调用MoveNext() 一次,但在大多数情况下该成本应该可以忽略不计;如果Any()使代码对您来说更具可读性,请随意使用它。

来源:反编译Enumerable.Any<TSource>代码。