Según el título ... ¿Hay alguna diferencia real entre list.First(), list.ElementAt (0) y list [0]?Diferencia entre list.First(), list.ElementAt (0) y list [0]?
Respuesta
.First()
arrojarán una excepción si la lista fuente no contiene elementos. See the Remarks section. Para evitar esto, useFirstOrDefault()
..ElementAt(0)
arrojará una excepción si el índice es mayor o igual que el número de elementos en la lista. Para evitar esto, useElementAtOrDefault(0)
. Si está utilizando LINQ to SQL, esto no se puede traducir a sql, mientras que.First()
se puede traducir aTOP 1
.El indexador también lanzará una excepción si el índice es mayor o igual que el número de elementos en la lista. No ofrece una opción
OrDefault
para evitar esto, y no se puede traducir a sql para LINQ To SQL. EDIT: olvidé mencionar la simple obviedad de que si su objeto es un IEnumerable, no puede usar un indexador como este. Si su objeto es una Lista real, entonces está bien.
No, no hay diferencia en absoluto. Todos hacen lo mismo, devuelven el primer elemento de la lista.
EDIT: Supongo que no debería decir que no hay diferencia. ElementAt() y First() tienen un control de errores que lo hacen, verificando nulos e índices fuera de rango, pero en realidad no debería ser notable.
En el caso "válido" (es decir, cuando una lista tiene al menos un elemento), son los mismos que señala APShredder. Si no hay elementos, entonces list[0]
y list.ElementAt(0
lanzarán un ArgumentIndexOutOfRangeException
, mientras que list.First()
arrojarán un InvalidOperationException
.
Otra consideración para elegir entre estas opciones es que First()
y ElementAt(0)
son ambos compatibles con cualquier secuencia - cualquier aplicación de IEnumerable
. (Esto puede ser útil ya que significa que puede intercambiar su variable con una implementación diferente de IEnumerable
sin tener que cambiar ningún código). Por el contrario, el indexador solo funciona para listas y otras estructuras que implementan directamente esa funcionalidad.
Por el contrario, usar el indexador puede ser una buena manera de garantizar (en tiempo de compilación) que está optimizando el rendimiento, ya que ElementAt
tiene una posibilidad razonable de ser O (n) en lugar de O (1) mientras que los indexadores suelen se supone que es rápido.
Quizás una pregunta anterior, pero hay una diferencia de rendimiento.
para el código de abajo:
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();
obtendrá los siguientes tiempos (en las garrapatas):
sw1.ElapsedTicks
sw2.ElapsedTicks
sw3.ElapsedTicks
Esto debería ser votado más, creo –
- 1. Diferencia entre array.GetLength (0) y array.GetUpperBound (0)
- 2. ¿Cuál es la diferencia entre list [-1:] [0] y list [len (list) -1]?
- 3. ¿Cuál es la diferencia entre [0-9] + y [0-9] ++?
- 4. ¿Cuál es la diferencia entre -0 y 0?
- 5. ¿Hay alguna diferencia entre i == 0 y 0 == i?
- 6. Diferencia entre $ a = 0 y $ a = '0' en PHP
- 7. diferencia entre (* ++ argv) [0] y mientras (c = * ++ argv [0])
- 8. Diferencia entre __file__ y sys.argv [0]
- 9. C++ diferencia entre 0 y 0.0
- 10. ¿Cuál es la diferencia entre {0} y ""?
- 11. diferencia CSS entre 0 y 0em
- 12. Diferencia entre Array.length = 0 y Array = []?
- 13. 0 + 0 + 0 ... + 0! = 0
- 14. ¿Cuál es la diferencia entre sys.exit (0) y os._exit (0)
- 15. Diferencia entre virtual void funcFoo() const = 0 y virtual void funcFoo() = 0;
- 16. Array de tipo nombrado: ¿Diferencia entre un [0] ['nombre'] y un '' nombre '] [0]?
- 17. ¿Cuál es la diferencia entre (char) 0 y '\ 0'? en C
- 18. ¿Hay alguna diferencia entre "margin: 0 auto;" y "margin: auto;"
- 19. diferencia entre archivos .so.0 y .so.0.0.0
- 20. hadoop: ¿diferencia entre 0 reductor y reductor de identidad?
- 21. ¿Existe alguna diferencia entre strlen() == 0 y empty()?
- 22. ¿Hay una diferencia entre BigDecimal ("0") y BigDecimal.ZERO?
- 23. php 5 strpos() ¿diferencia entre devolver 0 y falsa?
- 24. ¿Qué margen: 5px 0; y margen: 5px 0 0; ¿media?
- 25. PHP $ cadena {0} contra $ cadena [0];
- 26. sobre android Drawable getBounds return Rect (0, 0 - 0, 0)
- 27. ¿Cuál es la diferencia entre list y list [:] en python?
- 28. Diferencia entre $ ('selector') [0], $ ('selector'). Eq (índice) en jquery.
- 29. (objeto) == 0 (objeto) 0
- 30. list.item (0) Lista vs [0]
re: punto2 - Personalmente prefiero tener un índice de excepción rango que una referencia nula - los xOrDefault() métodos son malos! – MattDavey
@MattDavey Me explico por mi cuenta que los métodos OrDefault necesitan una verificación nula. No causan excepciones de referencia nula, la mala codificación sí lo hace. – ProfK
@ProfK No dije que causaron excepciones de referencia nula. Dije que preferiría tener una IndexOutOfRangeException que una referencia nula. Es una preferencia personal, por supuesto, pero no encuentro referencias nulas útiles de ninguna manera. – MattDavey