Depende de quanto você gosta da sintaxe da consulta linq, você pode usar os métodos de extensão diretamente como:
var item = Items.First(i => i.Id == 123);
E se você não quiser lançar um erro se a lista estiver vazia, use o FirstOrDefault
que retorna o valor padrão para o tipo de elemento ( null
para tipos de referência):
var item = Items.FirstOrDefault(i => i.Id == 123);
if (item != null)
{
// found it
}
Single()
e SingleOrDefault()
também pode ser usado, mas se você está lendo de um banco de dados ou algo que já garante exclusividade, eu não me incomodaria, pois tem que verificar a lista para ver se há duplicatas e lançamentos. First()
e FirstOrDefault()
param na primeira partida, para serem mais eficientes.
Da família First()
e Single()
, é aqui que eles jogam:
First()
- lança se vazio / não encontrado, não lança se duplicado
FirstOrDefault()
- retorna o padrão se vazio / não encontrado, não lança se duplicado
Single()
- lança se vazio / não encontrado, lança se houver duplicata
SingleOrDefault()
- retorna o padrão se vazio / não encontrado, lança se houver duplicata
Single()
eSingleOrDefault()
SE eu souber que os dados já são únicos (por exemplo, de um banco de dados que tem essa restrição, etc), pois oSingle()
obriga a examinar o resto da lista para encontrar uma possível duplicata, mas sou eu. Se você precisar reforçar sua singularidade neste ponto, useSingle()
family, se não, useFirst()
family.