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

bla*_*bla 25 c# list

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

Reb*_*off 28

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

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

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

  • @MattDavey我自我解释OrDefault方法需要空检查.它们不会导致空引用异常,编码错误. (4认同)
  • 回复:point2 - 就我个人而言,我宁愿索引超出范围异常而不是空引用 - 那些 xOrDefault() 方法是邪恶的! (2认同)
  • @ProfK 我没有说它们导致了空引用异常。我说我宁愿有一个 IndexOutOfRangeException 而不是一个空引用。当然,这是个人偏好,但我认为空引用没有任何用处。 (2认同)

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

  • 我认为应该更多地投资 (2认同)

car*_*ira 6

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


Kir*_*oll 6

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

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