列表之间的差异.第一个(),列出.ElementAt(0)和list[0]

本文关键字:之间 list ElementAt 列出 第一个 列表 | 更新日期: 2023-09-27 17:57:58

根据标题。。。列表之间有什么真正的区别吗。第一个(),列出。ElementAt(0)和list[0]?

列表之间的差异.第一个(),列出.ElementAt(0)和list[0]

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

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

  3. 如果索引大于或等于列表中的元素数,索引器还会引发异常。它没有提供OrDefault选项来避免这种情况,并且不能将其转换为LINQ to sql的sql。编辑:我忘了提一个简单明了的问题,如果你的对象是一个IEnumerable,你就不能使用这样的索引器。如果您的对象是一个实际的List,那么您就可以了。

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

对于以下代码:

 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();

您将获得以下时间(以刻度为单位):

  • lst[0]

    sw1.ElapsedTicks

    253

  • 第一个()

    sw2.ElapsedTicks

    438

  • 第一元素At(0)

    sw3.ElapsedTicks

    915

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

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

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

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

编辑:我想我不应该说没有区别。ElementAt()和First()都有一些错误处理,检查null和超出范围的索引,但这并不明显。

相关文章: