Подтвердить что ты не робот

Разница между list.First(), list.ElementAt(0) и списком [0]?

В соответствии с заголовком... Есть ли какая-либо реальная разница между list.First(), list.ElementAt(0) и списком [0]?

4b9b3361

Ответ 1

  • .First() выдаст исключение, если исходный список не содержит элементов. См. раздел "Примечания" . Чтобы избежать этого, используйте FirstOrDefault().

  • .ElementAt(0) выдаст исключение, если индекс больше или равен количеству элементов в списке. Чтобы избежать этого, используйте ElementAtOrDefault(0). Если вы используете LINQ To SQL, это не может быть переведено в sql, тогда как .First() может перевести на TOP 1.

  • Указатель также генерирует исключение, если индекс больше или равен количеству элементов в списке. Он не предлагает параметр OrDefault, чтобы избежать этого, и он не может быть переведен в sql для LINQ To SQL. EDIT: Я забыл упомянуть простую очевидность, что если ваш объект является IEnumerable, вы не можете использовать такой индекс. Если ваш объект является фактическим списком, то вы в порядке.

Ответ 2

Возможно, старый вопрос, но есть разница в производительности.

для кода ниже:

 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

Ответ 3

В "действительном" случае (т.е. когда список имеет хотя бы один элемент), они такие же, как указано APShredder. Если нет элементов, то list[0] и list.ElementAt(0 будут бросать ArgumentIndexOutOfRangeException, а list.First() будет вызывать InvalidOperationException.

Ответ 4

Еще одно соображение для выбора между этими параметрами заключается в том, что First() и ElementAt(0) совместимы с любой последовательностью - любая реализация IEnumerable. (Это может быть полезно, так как это означает, что вы можете поменять свою переменную с другой реализацией IEnumerable без необходимости изменять какой-либо код.) Напротив, индексатор работает только для списков и других структур, которые непосредственно реализуют эту функциональность.

И наоборот, использование индексатора может быть хорошим способом обеспечить (во время компиляции), что вы получаете оптимизированную производительность, поскольку ElementAt имеет разумные шансы быть O (n) вместо O (1), тогда как индексаторы обычно считается быстрым.

Ответ 5

Нет, никакой разницы. Они все делают одно и то же, верните первый элемент в списке.

EDIT: Я думаю, я не должен говорить, что нет никакой разницы. ElementAt() и First() имеют некоторую обработку ошибок, которые они выполняют, проверяя нули и индексы вне диапазона, но это не должно быть заметно.