368 votes

Que renvoie LINQ lorsque les résultats sont vides ?

J'ai une question sur les requêtes LINQ. Normalement, une requête renvoie un IEnumerable<T> type. Si le retour est vide, je ne suis pas sûr qu'il soit nul ou non. Je ne suis pas sûr que ToList() lancera une exception ou un message vide List<string> si rien n'est trouvé dans IEnumerable Résultat ?

   List<string> list = {"a"};
   // is the result null or something else?
   IEnumerable<string> ilist = from x in list where x == "ABC" select x;
   // Or directly to a list, exception thrown?
   List<string> list1 = (from x in list where x == "ABC" select x).ToList();

Je sais que c'est une question très simple, mais je n'ai pas de VS disponible pour le moment.

11 votes

Je suppose que le résultat est Enumerable.Empty ?

603voto

leppie Points 67289

Il retournera un énumérateur vide. Elle ne sera pas nulle. Vous pouvez dormir tranquille :)

2 votes

Juste pour info : tu es arrivé sur r/ProgrammerHumor.

1 votes

Lien ou cela n'a pas eu lieu :D

2 votes

47voto

Noich Points 1712

Vous pouvez également vérifier le .Any() méthode :

if (!YourResult.Any())

Il faut savoir que .Any récupérera toujours les enregistrements de la base de données ; en faisant un .FirstOrDefault()/.Where() sera tout aussi coûteux, mais vous serez alors en mesure d'attraper le ou les objets retournés par la requête.

7 votes

Où la question mentionne-t-elle une base de données ?

10 votes

Vous devrez demander à celui qui a édité, je n'ai pas mentionné de DB :)

0 votes

Le point de vue de l'éditeur est bon, cependant, DB ou pas. Je crois qu'ils disent .Any() va juste vous dire si vous avez des enregistrements correspondants, où une requête réelle pour trouver une valeur spécifique pourrait être nulle lorsque .Any() ne l'est pas.

23voto

JP Alioto Points 33482
var lst = new List<int>() { 1, 2, 3 };
var ans = lst.Where( i => i > 3 );

(ans == null).Dump();  // False
(ans.Count() == 0 ).Dump();  // True

(La décharge provient de LinqPad )

1 votes

Exactement ! Vous obtenez une meilleure indication des résultats

1 votes

TIL Count() est également une méthode, et pas seulement la propriété

4 votes

Ne devriez-vous pas utiliser .Any() parce que count va énumérer tous les éléments ?

17voto

pb. Points 4609

.ToList renvoie une liste vide. (identique à new List<T>() ) ;

7voto

Spence Points 15057

D'autres messages ici ont clairement indiqué que le résultat est un "vide". IQueryable qui ToList() sera correctement transformé en une liste vide, etc.

Soyez prudent avec certains opérateurs, car ils échoueront si vous leur envoyez un énumérable vide. Cela peut se produire lorsque vous les enchaînez.

3 votes

"Faites attention avec certains des opérateurs, car ils lanceront si vous leur envoyez un énumérable vide. Cela peut se produire lorsque vous les enchaînez." -- C'est ce qui m'a pris. J'avais une valeur de retour nulle que j'ai ensuite introduite dans une autre requête. Cela a provoqué le rejet de la deuxième requête, peu importe ce que je lui ai donné, car il n'y avait pas de valeur dans la deuxième requête.

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