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