Je me surprends à écrire beaucoup de code comme celui-ci pour sélectionner un élément qui correspond
var item = (from x in Items where x.Id == 123 select x).First();
Y a-t-il une façon plus propre de le faire ou est-ce aussi concis que je vais l'être?
EDIT: J'aurais dû dire "Une manière plus propre en utilisant la syntaxe linq". J'étais déjà au courant de la syntaxe lambda et ça commence à ressembler à ce que c'est en fait le seul moyen. J'ai cependant obtenu des informations utiles, alors merci à tous ceux qui ont répondu.
Single()
etSingleOrDefault()
SI je sais que les données sont déjà uniques (par exemple à partir d'une base de données qui a cette contrainte, etc.), car leSingle()
force à scanner le reste de la liste pour trouver un éventuel doublon, mais c'est moi. Si vous devez renforcer votre caractère unique à ce stade, utilisez laSingle()
famille, sinon utilisez laFirst()
famille.Réponses:
Dépend de combien vous aimez la syntaxe de requête linq, vous pouvez utiliser les méthodes d'extension directement comme:
Et si vous ne voulez pas lancer d'erreur si la liste est vide, utilisez
FirstOrDefault
qui renvoie la valeur par défaut pour le type d'élément (null
pour les types référence):Single()
etSingleOrDefault()
peut également être utilisé, mais si vous lisez à partir d'une base de données ou de quelque chose qui garantit déjà l'unicité, je ne prendrais pas la peine car il doit analyser la liste pour voir s'il y a des doublons et des jets.First()
etFirstOrDefault()
arrêtez-vous sur le premier match, donc ils sont plus efficaces.De la famille
First()
etSingle()
, voici où ils lancent:First()
- lance si vide / non trouvé, ne lance pas si dupliquéFirstOrDefault()
- renvoie la valeur par défaut si vide / introuvable, ne lance pas si dupliquéSingle()
- jette si vide / non trouvé, jette si un double existeSingleOrDefault()
- renvoie la valeur par défaut si vide / introuvable, lance s'il existe un doublonla source
i.Id == 123
FirstOrDefault ou SingleOrDefault peuvent être utiles, en fonction de votre scénario et du fait que vous souhaitez gérer le fait qu'il y ait zéro ou plusieurs correspondances:
Je ne sais pas comment cela fonctionne dans une requête linq 'from' mais dans la syntaxe lambda, cela ressemble à ceci:
la source
Voici les méthodes préférées:
Ou
la source
Juste pour faciliter la vie de quelqu'un, la requête linq avec expression lambda
aboutit à une requête SQL contenant un
select top (1)
.la source
Cela peut mieux se résumer à ceci.
var item = Items.First(x => x.Id == 123);
Votre requête collecte actuellement tous les résultats (et il peut y en avoir plus d'un) dans l'énumérable, puis prend le premier de cet ensemble, ce qui fait plus de travail que nécessaire.
Single / SingleOrDefault valent la peine, mais uniquement si vous souhaitez parcourir toute la collection et vérifier que la correspondance est unique en plus de la sélectionner. First / FirstOrDefault prendra simplement la première correspondance et partira, quel que soit le nombre de doublons existants.
la source
Vous pouvez utiliser la syntaxe de la méthode d'extension:
En dehors de cela, je ne sais pas combien vous pouvez obtenir plus concis, sans peut-être écrire vos propres méthodes d'extension spécialisées "First" et "FirstOrDefault".
la source
Where
par opposition àSelect
, ce qui a déjà été dit, mais cette réponse est incorrecte. Select in c # change les résultats en IEnumerable <bool>, donc vous obtenez unbool
pour le premier élémentx.Id == 123
Je vais vous dire ce qui a fonctionné pour moi:
Mon identifiant est la ligne que je veux interroger, dans ce cas je l'ai obtenu à partir d'un radGrid, puis je l'ai utilisé pour interroger, mais cette requête renvoie une ligne, vous pouvez alors attribuer les valeurs que vous avez obtenues de la requête à la zone de texte, ou quoi que ce soit , J'ai dû les affecter à textbox.
la source