Dans Linq, les méthodes d'extension telles que Where
renvoient une collection IEnumerable
, mais les méthodes de tri telles que OrderBy
renvoient une collection IOrderedEnumerable
.Comment Linq utilise-t-il les méthodes IEnumerable après une méthode IOrderedEnumerable?
Donc, si vous avez une question qui se termine par OrderBy
(à savoir retourne un IOrderedEnumerable
), vous ne pouvez pas ajouter plus tard une méthode Where
- le compilateur se plaint du type étant passé dans Where
.
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
query = query.Where(p => p.ProcessName.Length < 5);
Cependant, si vous faites tout en une seule requête, c'est bien!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);
Je l'ai regardé l'ensemble réflecteur pour voir si le compilateur a été ré-ordonner l'une des opérations, mais il ne semble pas avoir. Comment cela marche-t-il?
Oui, mais quelle est la différence entre les deux exemples? Pourquoi le second fonctionne-t-il mais le premier ne fonctionne pas? –
Le second n'essaie pas d'affecter une expression 'IEnumerable' dans une variable de type 'IOrderedEnumerable '. –