C#.First()与[0] [英] C# .First() vs [0]
本文介绍了C#.First()与[0]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
感兴趣的是,方法是否有任何区别.
因此,我创建了两个片段.
Interested, does approaches has any differences.
So, I created two snippets.
Snippet A
List<int> a = new List<int>();
a.Add(4);
a.Add(6);
int b = a.First();
和
Snippet B
List<int> a = new List<int>();
a.Add(4);
a.Add(6);
int b = a[0];
我们相信IL,所以
Snippet A IL
IL_0000: nop
IL_0001: newobj System.Collections.Generic.List<System.Int32>..ctor
IL_0006: stloc.0 // a
IL_0007: ldloc.0 // a
IL_0008: ldc.i4.4
IL_0009: callvirt System.Collections.Generic.List<System.Int32>.Add
IL_000E: nop
IL_000F: ldloc.0 // a
IL_0010: ldc.i4.6
IL_0011: callvirt System.Collections.Generic.List<System.Int32>.Add
IL_0016: nop
IL_0017: ldloc.0 // a
IL_0018: call System.Linq.Enumerable.First
IL_001D: stloc.1 // b
IL_001E: ret
和
Snippet B IL
IL_0000: nop
IL_0001: newobj System.Collections.Generic.List<System.Int32>..ctor
IL_0006: stloc.0 // a
IL_0007: ldloc.0 // a
IL_0008: ldc.i4.4
IL_0009: callvirt System.Collections.Generic.List<System.Int32>.Add
IL_000E: nop
IL_000F: ldloc.0 // a
IL_0010: ldc.i4.6
IL_0011: callvirt System.Collections.Generic.List<System.Int32>.Add
IL_0016: nop
IL_0017: ldloc.0 // a
IL_0018: ldc.i4.0
IL_0019: callvirt System.Collections.Generic.List<System.Int32>.get_Item
IL_001E: stloc.1 // b
IL_001F: ret
代码片段B产生了一个命令,其IL增大了,但是最后哪种方法更快?
Snippet B produced one command more IL, but which approach faster in the end?
推荐答案
您可以自己检查它:
static void Main()
{
List<long> resultsFirst = new List<long>();
List<long> resultsIndex = new List<long>();
Stopwatch s = new Stopwatch();
for (int z = 0; z < 100; z++)
{
List<int>[] lists = new List<int>[10000];
int temp = 0;
for (int i = 0; i < lists.Length; i++)
lists[i] = new List<int>() { 4, 6 };
s.Restart();
for (int i = 0; i < lists.Length; i++)
temp = lists[i].First();
s.Stop();
resultsFirst.Add(s.ElapsedTicks);
s.Restart();
for (int i = 0; i < lists.Length; i++)
temp = lists[i][0];
s.Stop();
resultsIndex.Add(s.ElapsedTicks);
}
Console.WriteLine("LINQ First() : " + resultsFirst.Average());
Console.WriteLine(Environment.NewLine);
Console.WriteLine("By index : " + resultsIndex.Average());
Console.ReadKey();
}
释放模式下的输出:
LINQ First():367
按索引:84
以调试模式输出:
LINQ First():401
按索引:177
P.S.
First方法的源代码是:
The source code for method First is:
public static TSource First<TSource>(this IEnumerable<TSource> source)
{
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
}
强制转换source as IList<TSource>
或创建Enumerator对象很可能是First()
相当慢的原因.
The casting operation source as IList<TSource>
or creating an Enumerator object is very likely the reason why First()
is considerably slower.
这篇关于C#.First()与[0]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文