Depende de cuánto le guste la sintaxis de consulta linq, puede usar los métodos de extensión directamente como:
var item = Items.First(i => i.Id == 123);
Y si no desea lanzar un error si la lista está vacía, use FirstOrDefault
que devuelve el valor predeterminado para el tipo de elemento ( null
para tipos de referencia):
var item = Items.FirstOrDefault(i => i.Id == 123);
if (item != null)
{
// found it
}
Single()
y SingleOrDefault()
también se puede usar, pero si está leyendo de una base de datos o algo que ya garantiza la singularidad, no me molestaría, ya que tiene que escanear la lista para ver si hay duplicados y lanzamientos. First()
y se FirstOrDefault()
detienen en el primer partido, para que sean más eficientes.
De la familia First()
y Single()
, aquí es donde tiran:
First()
- lanza si está vacío / no se encuentra, no lanza si está duplicado
FirstOrDefault()
- devuelve el valor predeterminado si está vacío / no se encuentra, no lanza si está duplicado
Single()
- lanza si está vacío / no se encuentra, lanza si existe un duplicado
SingleOrDefault()
- devuelve el valor predeterminado si está vacío / no se encuentra, arroja si existe un duplicado
Single()
ySingleOrDefault()
SI sé que los datos ya son únicos (por ejemplo, de una base de datos que tiene esa restricción, etc.), yaSingle()
que lo obliga a escanear el resto de la lista para encontrar un posible duplicado, pero ese soy yo. Si necesita hacer valer su singularidad en este punto, useSingle()
family, si no, useFirst()
family.