Cuándo usar.Primero y cuándo usar.¿FirstOrDefault con LINQ?


He buscado y realmente no he encontrado una respuesta clara en cuanto a cuándo querría usar .First y cuándo querría usar .FirstOrDefault con LINQ.

  • ¿Cuándo quieres usar .First? Solo cuando usted desea coger la excepción si no se devuelve ningún resultado?

    var result = List.Where(x => x == "foo").First();
    
  • ¿Y cuándo quieres usar .FirstOrDefault? ¿Cuándo siempre querrías el tipo predeterminado si no hay resultado?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Y para el caso, ¿qué pasa con Tomar?

    var result = List.Where(x => x == "foo").Take(1);
    
 693
Author: BoltClock, 2009-06-21

14 answers

Usaría First() cuando sepa o espere que la secuencia tenga al menos un elemento. En otras palabras, cuando es un acontecimiento excepcional que la secuencia está vacía.

Use FirstOrDefault() cuando sepa que necesitará verificar si hubo un elemento o no. En otras palabras, cuando es legal que la secuencia vacía. No debe confiar en el manejo de excepciones para el cheque. (Es una mala práctica y podría perjudicar el rendimiento).

Finalmente, la diferencia entre First() y Take() es que First() devuelve el elemento en sí, mientras que Take() devuelve una secuencia de elementos que contiene exactamente un elemento. (Si pasa 1 como parámetro).

 698
Author: driis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-07 08:52:38

.First lanzará una excepción cuando no haya resultados. .FirstOrDefault no lo hará, simplemente devolverá null (tipos de referencia) o el valor predeterminado del tipo de valor. (e.g like 0 for an int.) La pregunta aquí no es cuándo desea el tipo predeterminado, sino más: ¿Está dispuesto a manejar una excepción o manejar un valor predeterminado? Dado que las excepciones deben ser excepcionales, se prefiere FirstOrDefault cuando no está seguro de si va a obtener resultados de su consulta. Cuando lógicamente los datos deben ser allí, se puede considerar el manejo de excepciones.

Skip() y Take() se utilizan normalmente al configurar la paginación en los resultados. (Como mostrar los primeros 10 resultados, y los siguientes 10 en la siguiente página, etc.)

Espero que esto ayude.

 234
Author: Jeroen Landheer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-21 15:20:37

.First () lanzará una excepción si no hay fila que devolver, while .FirstOrDefault () devolverá el valor predeterminado (NULL para todos los tipos de referencia) en su lugar.

Así que si estás preparado y dispuesto a manejar una posible excepción, .First() está bien. Si prefiere comprobar el valor devuelto para != null de todos modos, entonces .FirstOrDefault() es su mejor opción.

Pero supongo que también es una preferencia personal. Utilice lo que tenga más sentido para usted y se adapte mejor a su estilo de codificación.

 93
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-10 09:00:33

Primero()

  1. Devuelve el primer elemento de una secuencia.
  2. Arroja un error cuando no hay ningún elemento en el resultado o la fuente es null.
  3. debe usarlo,si se espera más de un elemento y solo desea el primer elemento.

FirstOrDefault()

  1. Devuelve el primer elemento de una secuencia, o un valor predeterminado si no se encuentra ningún elemento.
  2. Lanza un error Solo si la fuente es nulo.
  3. debe usarlo, si se espera más de un elemento y solo desea el primer elemento. También es bueno si el resultado está vacío.

Tenemos una tabla UserInfos, que tiene algunos registros como se muestra a continuación. Sobre la base de esta tabla a continuación he creado ejemplo...

Tabla UserInfo

Cómo usar Primero()

var result = dc.UserInfos.First(x => x.ID == 1);

Solo hay un registro donde ID== 1. Debe devolver este registro
ID: 1 Nombre: Manish Apellido: Dubey Correo electrónico: [email protected]

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]

var result = dc.UserInfos.First(x => x.ID ==13);

No hay registro con ID== 13. Se debe producir un error.
InvalidOperationException: La secuencia no contiene elementos

Cómo usar FirstOrDefault()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

Solo hay un registro donde ID== 1. Debe devolver este registro
ID: 1 Nombre: Manish Apellido: Correo electrónico de Dubey: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

Hay varios registros donde FName == "Rahul". El primer registro debe ser devuelto.
ID: 7 Nombre: Rahul Apellido: Sharma Correo electrónico: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

No hay registro con ID== 13. El valor devuelto es null

Espero que te ayude a entender cuándo usar First() o FirstOrDefault().

 58
Author: Mukesh Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-26 12:45:16

En primer lugar, Take es un método completamente diferente. Devuelve un IEnumerable<T> y no un solo T, por lo que está fuera.

Entre First y FirstOrDefault, debe usar First cuando esté seguro de que un elemento existe y si no lo hace, entonces hay un error.

Por cierto, si su secuencia contiene elementos default(T) (por ejemplo, null) y necesita distinguir entre estar vacío y el primer elemento ser null, no puede usar FirstOrDefault.

 17
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 19:23:55

Primero:

  • Devuelve el primer elemento de una secuencia
  • Lanza excepción: No hay elementos en el resultado
  • Use when: Cuando se espera más de 1 elemento y desea solo el primer

FirstOrDefault:

  • Devuelve el primer elemento de una secuencia, o un valor predeterminado si no se encuentra ningún elemento
  • Lanza excepción: Solo si la fuente es null
  • Use when: Cuando se espera más de 1 elemento y desea solo el primero. También está bien que el resultado esté vacío

De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

 13
Author: user2051770,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 14:29:46

Otra diferencia a tener en cuenta es que si está depurando una aplicación en un entorno de producción, es posible que no tenga acceso a los números de línea, por lo que identificar qué instrucción .First() en particular en un método arrojó la excepción puede ser difícil.

El mensaje de excepción tampoco incluirá ninguna expresión Lambda que pueda haber utilizado, lo que haría que cualquier problema sea aún más difícil de depurar.

Es por eso que siempre uso FirstOrDefault() a pesar de que sé que una entrada nula constituiría una situación excepcional.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
 6
Author: Kye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-17 00:57:54

Encontré un sitio web que aparece para explicar la necesidad de FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Si no hay resultados para una consulta, y desea llamar a First() o Single() para obtener una sola fila... Obtendrá una excepción de "Secuencia no contiene elementos".

Descargo de responsabilidad: Nunca he usado LINQ, así que mis disculpas si esto está fuera de lugar.

 3
Author: NULL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 19:24:55

Primero()

Cuando usted sabe que el resultado contiene más de 1 elemento esperado y usted debe solamente el primer elemento de la secuencia.

FirstOrDefault()

FirstOrDefault() es igual que First() excepto que, si ningún elemento coincide con la condición especificada, devuelve el valor predeterminado del tipo subyacente de la colección genérica. No lanza InvalidOperationException si no se encuentra ningún elemento. Pero la colección de elemento o una secuencia es nula de lo que arroja un salvedad.

 3
Author: Nimesh khatri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 10:40:00
someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

¿Cuál usar? Debe decidirse por la lógica de negocio, y no por el miedo a la excepción/al fracaso del programa.

Por ejemplo, Si la lógica de negocios dice que no podemos tener cero transacciones en cualquier día laborable (Solo asumir). Entonces no debe tratar de manejar este escenario con alguna programación inteligente. Siempre usaré First () sobre dicha colección, y dejaré que el programa falle si algo más arruinó la lógica del negocio.

Código:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

Me gustaría ver otros comentarios sobre esto.

 2
Author: Manish Basantani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-21 22:25:08

Ok déjame dar mis dos centavos. First / Firstordefault son para cuando se utiliza el segundo constructor. No voy a explicar lo que es, pero es cuando potencialmente siempre usarías uno porque no quieres causar una excepción.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));
 1
Author: Arian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-03 22:02:40

Este tipo de función pertenece a los operadores de elementos. A continuación se definen algunos operadores de elementos útiles.

  1. First / FirstOrDefault
  2. Last / LastOrDefault
  3. Single / SingleOrDefault

Usamos operadores de elemento cuando necesitamos seleccionar un solo elemento de una secuencia basada en una determinada condición. He aquí un ejemplo.

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

El operador First () devuelve el primer elemento de una secuencia después de haber satisfecho la condición. Si no se encuentra ningún elemento entonces lanzará una excepción.

Int result = items.Donde (item = > item = = 2).First ();

El operador FirstOrDefault () devuelve el primer elemento de una secuencia después de haber cumplido la condición. Si no se encuentra ningún elemento, devolverá el valor predeterminado de ese tipo.

Int result1 = items . Donde (item = > item = = 2).FirstOrDefault ();

 0
Author: Sheo Dayal Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-29 05:06:32
 -3
Author: Mou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-06 18:45:51

Linq muchas formas de implementar una consulta simple en colecciones, solo escribimos joins en sql, se puede aplicar un filtro primero o último dependiendo de la necesidad y necesidad.

Aquí hay un ejemplo donde podemos encontrar un elemento con un id en una colección. Para agregar más sobre esto, los métodos Primero, FirstOrDefault, idealmente devolverían lo mismo cuando una colección tiene al menos un registro. Si, sin embargo, una colección está bien para estar vacía. entonces First devolverá una excepción pero FirstOrDefault devolverá null o default. Por ejemplo, int devolverá 0. Por lo tanto, el uso de tales se dice que es una preferencia personal, pero es mejor usar FirstOrDefault para evitar el manejo de excepciones. aquí hay un ejemplo donde, ejecutamos una colección de transactionlist

 -8
Author: venkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 15:03:28