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 FirstOrDefaultque retorna o valor padrão para o tipo de elemento ( nullpara 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.