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

时间:2014-09-01 13:28:11

标签: 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]
}

抱歉,如果出现重复问题

4 个答案:

答案 0 :(得分:7)

哪个表现更好?数组访问器,因为它不需要将一个方法放在堆栈上,并且不必执行First方法最终到达数组访问器

正如Reference Source of Enumerable所示,First()实际上是:

IList<TSource> list = source as IList<TSource>;
if (list != null) {
    if (list.Count > 0) return list[0];
}

所以它没有做任何其他事情,只需要更多的步骤来实现目标。

第二部分(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;
}

这将逐个遍历每个项目,直到获得所需的索引。在这种情况下0,很快就会非常。调用ToList的另一个将永远效率较低,因为它必须创建一个新对象并将所有项目放在那里以获得第一个。第一个电话肯定更快。

答案 1 :(得分: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

首先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); 
}

13将附加到结果但是10没有因为10和13首先被添加到列表后面的列表被搜索。

如果您想了解更多关于Linq的信息,可以阅读Joseph Rattz和Adam Freeman撰写的Pro LINQ书http://www.apress.com/9781430226536

答案 2 :(得分:1)

  • list.Where(x => x > 1).First() vs. list.Where(x => x > 1).ToList()[0]

    由于适用于Enumerable,First()应该更快 延期执行。在您的情况下,结果将很快返回 已找到符合条件的列表中的一项 其中(x =&gt; x&gt; 1)

    在第二个示例中,您的初始列表必须完全枚举, 符合条件的所有项目将被放入临时列表中,您可以从中获取带阵列访问者的第一个项目。

  • str.Split(';').First() vs. str.Split(';')[0]

    在这种情况下,方法Split()已经返回一个数组。阵列访问器可能稍微快一些,但在大多数情况下性能增益可以忽略不计。

答案 3 :(得分:1)

这些之间没有显着差异,你会得到几乎相同的结果:

 str.Split(';').First() vs. str.Split(';')[0]

对于第二次比较,这里只询问第一个元素

list.Where(x => x > 1).First()

所以只要WhereIterator返回完成的项目。{p>但是在第二个你将所有结果放入列表然后使用索引器获取第一个项目,因此它会更慢。