929 votes

Quand l’utiliser. Premier et quand l’utiliser. FirstOrDefault, avec LINQ ?

J'ai cherché et n'ai pas vraiment trouvé de réponse claire quand vous voulez les utiliser .First et quand vous voulez les utiliser .FirstOrDefault avec LINQ.

  • Quand vous voulez utiliser .First? Seulement quand vous voulez attraper l'exception, si pas de résultats retournés?

    var result = List.Where(x => x == "foo").First();
    
  • Et quand vous souhaitez utiliser .FirstOrDefault? Au moment où vous aurez toujours envie le type par défaut si pas de résultat?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Et d'ailleurs, à ce sujet?

    var result = List.Where(x => x == "foo").Take(1);
    

895voto

driis Points 70872

Je voudrais utiliser First() quand je sais ou attendre la séquence d'avoir au moins un élément. En d'autres termes, lorsque c'est un événement extraordinaire lorsque la séquence est vide.

Utiliser FirstOrDefault() quand vous savez que vous aurez besoin de vérifier si il y avait un élément ou non. En d'autres termes, lorsqu'il est légal pour la séquence vide. Vous ne devez pas compter sur la manipulation d'exception pour le vérifier. (C'est une mauvaise pratique qui pourrait nuire à la performance).

Enfin, la différence entre First() et Take() que First() retourne l'élément lui-même, tout en Take() retourne une séquence d'éléments que contient exactement un élément. (Si vous passez 1 comme paramètre).

307voto

Jeroen Landheer Points 3346

.D'abord, une exception sera levée quand il n'y a pas des résultats. .FirstOrDefault ne le sera pas, il suffit de retourner la valeur null (les types de référence) ou la valeur par défaut du type de valeur. (e.g comme " 0 " pour un int.) La question ici n'est pas quand vous voulez le type par défaut, mais plus: Êtes-vous prêt à gérer une exception ou de manipuler une valeur par défaut? Depuis les exceptions doivent être exceptionnel, FirstOrDefault est préféré lorsque vous ne savez pas si vous allez obtenir les résultats de votre requête. Lorsque logiquement les données devraient être là, la gestion des exceptions peuvent être envisagées.

Skip() et() sont normalement utilisés lors de la configuration de la pagination dans les résultats. (Comme montrant les 10 premiers résultats, et les 10 prochaines sur la prochaine page, etc).

Espérons que cette aide.

137voto

marc_s Points 321990

. First() lèvera une exception si il n’y a pas de ligne à renvoyer, pendant que. FirstOfDefault() retourne une valeur NULL à la place.

Alors si vous êtes préparé et prêt à gérer une exception possible. First() est très bien. Si vous préférez vérifier la valeur de retour pour ! = null de toute façon, alors. FirstOrDefault() est votre meilleur choix.

Mais je suppose que c’est une préférence personnelle, un peu trop. Utiliser selon ce qui est plus logique pour vous et s’adapte à votre style de codage mieux.

21voto

Mehrdad Afshari Points 204872

Tout d'abord, Take est une méthode complètement différente. Elle renvoie un IEnumerable<T> et pas un seul T, de sorte que c'est.

Entre First et FirstOrDefault, vous devez utiliser First lorsque vous êtes sûr que l'élément existe et si elle ne le fait pas, il y a une erreur.

Par ailleurs, si votre séquence contient default(T) éléments (par exemple, null) et vous avez besoin de distinguer entre le fait d'être vide et le premier élément est - null, vous ne pouvez pas utiliser FirstOrDefault.

15voto

user2051770 Points 71

D'abord:

  • Retourne le premier élément d'une séquence
  • Throws exception: Il n'y a pas d'éléments dans le résultat
  • Utiliser lorsque: Lorsque plus de 1 élément est prévu et que vous voulez seulement la première

FirstOrDefault:

  • Retourne le premier élément d'une séquence, ou une valeur par défaut si aucun élément n'est trouvé
  • Throws exception: si la source est nulle
  • Utiliser lorsque: Lorsque plus de 1 élément est prévu et que vous voulez seulement la première. Aussi c'est ok pour que le résultat soit vide

De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

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