Eu me pego escrevendo muito código como este para selecionar um item que corresponda
var item = (from x in Items where x.Id == 123 select x).First();
Existe uma maneira mais limpa de fazer isso ou é o mais conciso que vou ser?
EDIT: Deveria ter dito "maneira mais limpa usando sintaxe linq". Eu já estava ciente da sintaxe lambda e está começando a parecer que, na verdade, é a única maneira. Eu recebi algumas informações úteis, então, obrigado a todos que responderam.
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.Respostas:
Depende de quanto você gosta da sintaxe da consulta linq, você pode usar os métodos de extensão diretamente como:
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):Single()
eSingleOrDefault()
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()
eFirstOrDefault()
param na primeira partida, para serem mais eficientes.Da família
First()
eSingle()
, é aqui que eles jogam:First()
- lança se vazio / não encontrado, não lança se duplicadoFirstOrDefault()
- retorna o padrão se vazio / não encontrado, não lança se duplicadoSingle()
- lança se vazio / não encontrado, lança se houver duplicataSingleOrDefault()
- retorna o padrão se vazio / não encontrado, lança se houver duplicatafonte
i.Id == 123
FirstOrDefault ou SingleOrDefault pode ser útil, dependendo do seu cenário e se você deseja lidar com a existência de zero ou mais de uma correspondência:
Eu não sei como isso funciona em uma consulta linq 'de', mas na sintaxe lambda se parece com isto:
fonte
Estes são os métodos preferidos:
Ou
fonte
Só para facilitar a vida de alguém, a consulta linq com expressão lambda
resulta em uma consulta SQL com um
select top (1)
nele.fonte
Isso pode ser melhor condensado nisto.
var item = Items.First(x => x.Id == 123);
No momento, sua consulta está coletando todos os resultados (e pode haver mais de um) dentro do enumerável e, em seguida, pegando o primeiro desse conjunto, fazendo mais trabalho do que o necessário.
Single / SingleOrDefault valem a pena, mas apenas se você quiser iterar por toda a coleção e verificar se a correspondência é única, além de selecionar essa correspondência. First / FirstOrDefault apenas pegará a primeira correspondência e sairá, independentemente de quantas duplicatas realmente existam.
fonte
Você pode usar a sintaxe do método de extensão:
Fora isso, não tenho certeza de quão mais conciso você pode ser, sem talvez escrever seus próprios métodos de extensão especializados "First" e "FirstOrDefault".
fonte
Where
ao contrário deSelect
, que já foi declarado, mas essa resposta está incorreta. Selecionar em c # altera os resultados para IEnumerable <bool>, então você está obtendo umbool
para o primeiro itemx.Id == 123
Vou te contar o que funcionou para mim:
Meu id é a linha que eu quero consultar, neste caso eu peguei de um radGrid, então usei para consultar, mas essa consulta retorna uma linha, então você pode atribuir os valores que você obteve da consulta para a caixa de texto, ou qualquer coisa , Tive que atribuí-los à caixa de texto.
fonte