specify firstordefault first example collection c# .net linq

c# - example - ¿Cuándo usar.First y cuándo usar.FirstOrDefault con LINQ?



firstordefault() (14)

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

Entonces, si está preparado y dispuesto a manejar una posible excepción, .First() está bien. Si prefiere verificar el valor de retorno para! = .FirstOrDefault() todos modos, entonces .FirstOrDefault() es su mejor opción.

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

He buscado por todos .First y no he encontrado una respuesta clara sobre cuándo querría usar. .First y cuándo querría usar .FirstOrDefault con LINQ.

  • ¿Cuándo querrías usar. .First ? ¿Solo cuando querría capturar la excepción si no se obtuvieron resultados?

    var result = List.Where(x => x == "foo").First();

  • ¿Y cuándo quieres usar .FirstOrDefault ? ¿Cuándo siempre querrá el tipo predeterminado si no hay resultados?

    var result = List.Where(x => x == "foo").FirstOrDefault();

  • Y para el caso, ¿qué hay de Take?

    var result = List.Where(x => x == "foo").Take(1);


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

Entre First y FirstOrDefault , debe usar First cuando esté seguro de que existe un elemento y, en caso contrario, 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 .


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 "La secuencia no contiene elementos".

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


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

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

Utilizamos operadores de elementos cuando necesitamos seleccionar un elemento único de una secuencia en función de una determinada condición. Aquí hay un ejemplo.

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

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

int result = items.Where (item => item == 2) .First ();

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

int result1 = items.Where (item => item == 2) .FirstOrDefault ();



Ok déjame darte mis dos centavos. First / Firstordefault son para cuando usa el segundo constructor. No explicaré qué 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); }));


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é declaración en particular de .First() 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 incluso más difícil de depurar.

Por eso siempre uso FirstOrDefault() aunque 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)); }


Primero:

  • Devuelve el primer elemento de una secuencia.
  • Excepción de tiros: no hay elementos en el resultado.
  • Se usa cuando: cuando se espera más de 1 elemento y solo quieres el primero

FirstOrDefault:

  • Devuelve el primer elemento de una secuencia o un valor predeterminado si no se encuentra ningún elemento
  • Emite excepción: solo si la fuente es nula
  • Utilice cuándo: cuando se espera más de 1 elemento y solo desea el primero. También está bien que el resultado esté vacío.

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


Usaría First() cuando conozco o espero que la secuencia tenga al menos un elemento. En otras palabras, cuando es 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 esté vacía. No debe confiar en el manejo de excepciones para el cheque. (Es una mala práctica y podría dañar 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).


linq muchas formas de implementar una consulta simple en colecciones, solo escribimos uniones en SQL, un filtro se puede aplicar primero o al final dependiendo de la necesidad y la 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 First, FirstOrDefault , idealmente devolverían lo mismo cuando una colección tenga al menos un registro. Si, sin embargo, una colección está bien estar vacía. luego First devolverá una excepción, pero FirstOrDefault devolverá null o por defecto. Por ejemplo, int devolverá 0. Por lo tanto, el uso de los FirstOrDefault se dice que es una preferencia personal, pero es mejor usar FirstOrDefault para evitar el manejo de excepciones.


.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. (p. ej., me gusta 0 para un 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 obtener resultados de su consulta. Cuando lógicamente los datos deberían estar allí, se puede considerar el manejo de excepciones.

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

Espero que esto ayude.


Primero()

  1. Devuelve el primer elemento de una secuencia.
  2. Se produce un error cuando no hay ningún elemento en el resultado o la fuente es nula.
  3. debe usarlo, si se espera más de un elemento y desea solo 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 nula.
  3. debe usarlo, si se espera más de un elemento y desea solo el primer elemento. También es bueno si el resultado está vacío.

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

Cómo usar First ()

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

Solo hay un registro donde ID == 1. Debería 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". 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. Debería devolver este registro
ID: 1 Nombre: Manish Apellido: Dubey Correo electrónico: [email protected]

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

Hay varios registros donde FName == "Rahul". 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 de retorno es nulo

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


Primero()

Cuando sepa que el resultado contiene más de 1 elemento esperado, solo debe tener el primer elemento de secuencia.

FirstOrDefault ()

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


someList.First(); // exception if collection is empty. someList.FirstOrDefault(); // first item or default(Type)

¿Cuál usar? Debe decidirse por la lógica empresarial, y no por el temor a la excepción / falla del programa.

Por ejemplo, si la lógica de negocios dice que no podemos tener cero transacciones en ningún día laborable (solo suponga). Entonces no debes 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 estropea la lógica de negocios.

Código:

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

Me gustaría ver otros comentarios sobre esto.