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

时间:2011-05-29 01:41:43

标签: c# list

根据标题...... list.First(),list.ElementAt(0)和list [0]之间是否存在真正的区别?

5 个答案:

答案 0 :(得分:28)

    如果源列表不包含任何元素,
  1. .First()将抛出异常。 See the Remarks section。为避免这种情况,请使用FirstOrDefault()

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

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

答案 1 :(得分:19)

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

代码如下:

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

您将获得以下时间(以刻度表示):

sw1.ElapsedTicks

253

sw2.ElapsedTicks

438

sw3.ElapsedTicks

915

答案 2 :(得分:6)

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:1)

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

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