按照标题...... list.First(),list.ElementAt(0)和list [0]之间有什么真正的区别吗?
Reb*_*off 28
.First()如果源列表不包含任何元素,则将抛出异常. 请参阅备注部分.为避免这种情况,请使用FirstOrDefault().
.ElementAt(0)如果索引大于或等于列表中元素的数量,则抛出异常.为避免这种情况,请使用ElementAtOrDefault(0).如果您正在使用LINQ To SQL,则无法将其转换为sql,而.First()可以转换为TOP 1.
如果索引大于或等于列表中元素的数量,索引器也将抛出异常.它没有提供OrDefault避免这种情况的选项,也无法将其转换为LINQ To SQL的sql.编辑:我忘了提到一个简单的明显,如果你的对象是一个IEnumerable,你不能使用像这样的索引器.如果你的对象是一个实际的List,那你就没事了.
Dan*_*ski 20
也许是一个老问题,但存在性能差异.
对于以下代码:
var lst = new List<int>();
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();
Run Code Online (Sandbox Code Playgroud)
你会得到以下时间(以刻度表示):
sw1.ElapsedTicks
253
sw2.ElapsedTicks
438
sw3.ElapsedTicks
915
在"有效"情况下(即,当列表具有至少一个元素时),它们与APShredder指出的相同.如果没有的元素,然后list[0]和list.ElementAt(0将抛出ArgumentIndexOutOfRangeException,而list.First()将抛出InvalidOperationException.
选择这些选项的另一个考虑因素是First()并且ElementAt(0)都兼容任何序列 - 任何实现IEnumerable.(这可能很有用,因为它意味着您可以使用不同的实现替换您的变量,IEnumerable而无需更改任何代码.)相比之下,索引器仅适用于直接实现该功能的列表和其他结构.
相反,使用索引器可以是确保(在编译时)您获得优化性能的好方法,因为ElementAt它有合理的机会是O(n)而不是O(1),而索引器通常被认为是快速的.