list.First(),list.ElementAt(0)和list 之间的区别?

按照标题…… list.First(),list.ElementAt(0)和list [0]之间有什么真正的区别吗?

  1. 如果源列表不包含任何元素,则.First()将抛出exception。 请参阅备注部分 。 要避免这种情况,请使用FirstOrDefault()

  2. 如果索引大于或等于列表中元素的数量,则.ElementAt(0)将抛出exception。 要避免这种情况,请使用ElementAtOrDefault(0) 。 如果您正在使用LINQ To SQL,则无法将其转换为sql,而.First()可以转换为TOP 1

  3. 如果索引大于或等于列表中元素的数量,索引器也将抛出exception。 它没有提供OrDefault选项来避免这种情况,也无法将其转换为LINQ To SQL的sql。 编辑:我忘了提到一个简单的明显,如果你的对象是IEnumerable,你不能使用像这样的索引器。 如果你的对象是一个实际的List,那你就没事了。

也许是一个老问题,但存在性能差异。

对于以下代码:

  var lst = new List(); for (int i = 0; i < 1500; i++) { lst.Add(i); } int temp; Stopwatch sw1 = new Stopwatch(); sw1.Start(); for (int i = 0; i < 100; i++) { temp = lst[0]; } sw1.Stop(); Stopwatch sw2 = new Stopwatch(); sw2.Start(); for (int i = 0; i < 100; i++) { temp = lst.First(); } sw2.Stop(); Stopwatch sw3 = new Stopwatch(); sw3.Start(); for (int i = 0; i < 100; i++) { temp = lst.ElementAt(0); } sw3.Stop(); 

你会得到以下时间(以刻度表示):

sw1.ElapsedTicks

253

sw2.ElapsedTicks

438

sw3.ElapsedTicks

915

在这些选项之间进行选择的另一个考虑因素是First()ElementAt(0)都与任何序列兼容 – IEnumerable任何实现。 (这可能很有用,因为它意味着您可以使用IEnumerable的不同实现替换您的变量,而无需更改任何代码。)相比之下,索引器仅适用于直接实现该function的列表和其他结构。

相反,使用索引器可以是确保(在编译时)您获得优化性能的好方法,因为ElementAt有合理的机会成为O(n)而不是O(1)而索引器通常被认为是快速的。

在“有效”情况下(即,当列表具有至少一个元素时),它们与APShredder指出的相同。 如果没有元素,则list[0]list.ElementAt(0将抛出ArgumentIndexOutOfRangeException ,而list.First()将抛出InvalidOperationException

不,没有任何区别。 他们都做同样的事情,返回列表中的第一项。

编辑:我想我不应该说没有区别。 ElementAt()和First()都有一些error handling,检查空值和超出范围的索引,但它不应该引人注意。