В соответствии с заголовком... Есть ли какая-либо реальная разница между list.First(), list.ElementAt(0) и списком [0]?
Разница между list.First(), list.ElementAt(0) и списком [0]?
Ответ 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() имеют некоторую обработку ошибок, которые они выполняют, проверяя нули и индексы вне диапазона, но это не должно быть заметно.