102 votes

Code Linq pour sélectionner un élément

Je me retrouve à é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();

Existe-t-il un moyen plus propre de le faire ou est-ce le plus concis que je puisse obtenir ?

EDIT : J'aurais dû dire "Méthode plus propre utilisant la syntaxe linq". Je connaissais déjà la syntaxe lambda et il semble que ce soit la seule façon de procéder. J'ai tout de même obtenu des informations utiles, alors merci à tous ceux qui ont répondu.

169voto

James Michael Hare Points 19077

Cela dépend de votre goût pour la syntaxe des requêtes linq. Vous pouvez utiliser directement les méthodes d'extension, par exemple :

var item = Items.First(i => i.Id == 123);

Et si vous ne voulez pas lancer une 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 de référence) :

var item = Items.FirstOrDefault(i => i.Id == 123);

if (item != null)
{
    // found it
}

Single() et SingleOrDefault() peut également être utilisé, mais si vous lisez à partir d'une base de données ou quelque chose qui garantit déjà l'unicité, je ne m'en soucierais pas car il doit scanner la liste pour voir s'il y a des doublons et les lancer. First() et FirstOrDefault() s'arrêtent au premier match, ils sont donc plus efficaces.

De la First() et Single() famille, voilà où ils lancent :

  • First() - jette si vide/non trouvé, ne jette pas si dupliqué
  • FirstOrDefault() - renvoie la valeur par défaut si vide/non trouvé, ne lance pas si dupliqué
  • Single() - rejette si vide/non trouvé, rejette si un duplicata existe
  • SingleOrDefault() - renvoie la valeur par défaut si vide/non trouvé, lance la procédure si un double existe

16voto

stuartd Points 22668

FirstOrDefault ou SingleOrDefault peut être utile, en fonction de votre scénario, et si vous voulez gérer le fait qu'il y ait zéro ou plus d'une correspondance :

FirstOrDefault : Renvoie le premier élément d'une séquence, ou une valeur par défaut si aucun élément n'est trouvé.

SingleOrDefault : Retourne le seul élément d'une séquence, ou une valeur par défaut si la séquence est vide. valeur par défaut si la séquence est vide ; cette méthode lève une exception si il y a plus d'un élément dans la séquence

Je ne sais pas comment cela fonctionne dans une requête linq 'from' mais en syntaxe lambda, cela ressemble à ceci :

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);

10voto

James Hill Points 27532

Ce sont les méthodes préférées :

var item = Items.SingleOrDefault(x => x.Id == 123);

Ou

var item = Items.Single(x => x.Id == 123);

10voto

Amal Points 107

Juste pour faciliter la vie de quelqu'un, la requête linq avec l'expression lambda

(from x in Items where x.Id == 123 select x).FirstOrDefault();

donne lieu à une requête SQL avec un select top (1) en elle.

7voto

Chris Hannon Points 2612

Cela peut être mieux condensé à ceci.

var item = Items.First(x => x.Id == 123);

Votre requête collecte actuellement tous les résultats (il peut y en avoir plus d'un) dans l'énumérable, puis prend le premier dans l'énumérable. que en faisant plus de travail que nécessaire.

Single/SingleOrDefault sont intéressants, mais seulement si vous voulez itérer dans toute la collection et vérifier que la correspondance est unique en plus de sélectionner cette correspondance. First/FirstOrDefault se contentera de prendre la première correspondance et de partir, quel que soit le nombre de doublons existants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X