linq.first()与array [0]之间的区别

dev*_*hog 8 c#

我想知道在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)

对不起如果有重复的问题

Pat*_*man 7

哪个表现更好?数组访问,因为这并不需要一个方法被放在堆栈上,并没有执行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将始终效率较低,因为它必须创建一个新对象并将所有项目放在那里以获得第一个.第一个电话肯定更快.


Syl*_*qaz 5

简单压缩性能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