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 FirstOrDefaultque devuelve el valor predeterminado para el tipo de elemento ( nullpara 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.