我想知道在list.first()和list [0]的引擎下发生了什么,并且表现更好.
比如哪个更快?
for(int i = 0; i < 999999999999... i++)
{
str.Split(';').First() vs. str.Split(';')[0]
list.Where(x => x > 1).First() vs. list.Where(x => x > 1).ToList()[0]
}
Run Code Online (Sandbox Code Playgroud)
对不起如果有重复的问题
哪个表现更好?数组访问,因为这并不需要一个方法被放在堆栈上,并没有执行First方法,最终得到的数组访问.
作为节目的参考源Enumerable,First()实际上是:
IList<TSource> list = source as IList<TSource>;
if (list != null) {
if (list.Count > 0) return list[0];
}
Run Code Online (Sandbox Code Playgroud)
所以它没有做任何其他事情,它只需要更多的步骤来实现目标.
对于你的第二部分(list.Where(x => x > 1).First()对比list.Where(x => x > 1).ToList()[0]):
Where返回一个IEnumerable,不是IList这样,它不会去方法的第一部分,First而是第二部分:
using (IEnumerator<TSource> e = source.GetEnumerator()) {
if (e.MoveNext()) return e.Current;
}
Run Code Online (Sandbox Code Playgroud)
这将逐个遍历每个项目,直到获得所需的索引.在这种情况下0,所以它会到达那里非常快.另一个调用ToList将始终效率较低,因为它必须创建一个新对象并将所有项目放在那里以获得第一个.第一个电话肯定更快.
简单压缩性能http://pastebin.com/bScgyDaM
str.Split(';').First(); : 529103
str.Split(';')[0]; : 246753
list.Where(x => x == "a").First(); : 98590
list.Where(x => x == "a").ToList()[0]; : 230858
Run Code Online (Sandbox Code Playgroud)
如果你有简单的数组,那么首先vs [0]是[0],因为它只计算内存中的加法器.但如果你与其他人合并LINQ命令更快就是First().例如Where().First()搜索直到找到第一个元素.Where().ToList()[0]找到所有元素然后转换为list并进行简单的计算.
另一件事是Where()是一种延迟方法.在枚举结果中的项之前,不会执行仅包含延迟方法的查询.所以你可以
list.Where( x => x>12);
list.add(10);
list.add(13);
foreach (int item in list)
{
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)
13将附加到结果但是10没有因为10和13首先被添加到列表中以后列表被搜索.
如果您想了解更多关于Linq的信息,可以阅读Joseph Rattz和Adam Freeman撰写的Pro LINQ书http://www.apress.com/9781430226536