Le type (tel qu'affiché par Intellisense) est logique si vous comprenez la nature de lambda expressions dans .NET/C#. Sinon, cela peut en effet sembler un peu étrange au nouveau venu. Commencez en considérant que le type de keySelector, Func < TSource, TKey > est simplement un délégué. Avant de C# 3.0, vous appelleriez une telle méthode en faisant passer un délégué en tant que paramètre, par exemple:
IEnumerable<string> sortedWords = words.OrderBy(new Func<string, int>(mySelectorMethod));
où mySelectorMethod est le nom d'une méthode ordinaire qui prend une chaîne comme paramètre et retourne un int. (En passant, je suppose que vous pourriez utiliser des délégués anonymes, mais n'allons pas là pour l'instant.) Notez également que cet exemple est purement illustratif, car LINQ est presque toujours utilisé avec .NET 3.5/C# 3.0 (bien que je crois il peut être utilisé avec/.NET 2.0/C# 2.0 - quelqu'un me corrige si je me trompe). Depuis C# 3.0, les méthodes peuvent être définies en ligne sous la forme d'expressions lambda, qui sont destinées à être utilisées précisément dans ces circonstances. Lisez l'article MSDN sur les expressions lambda (ci-dessus) si vous voulez obtenir une introduction correcte, mais je vais simplement décrire l'utilisation dans ce contexte spécifique. Comme vous dites, votre code (en C# 3.0) est quelque chose comme ce qui suit:
var sortedWords = words.OrderBy(a => a.Length);
La partie de l'expression qui est a => a.Length
est l'expression lambda, ce qui est vraiment juste un raccourci pour la déclaration d'une ligne de fonction. La syntaxe des expressions lambda est assez simple pour la plupart; à gauche de => les arguments sont spécifiés, généralement sous la forme (arg1, arg2, arg3), mais comme il n'y en a qu'un dans ce cas, vous pouvez omettre les parenthèses. A droite du => est l'expression qui est la valeur de retour de la fonction (expression lambda plus précisément).Vous pouvez également inclure le code réel avec une instruction return dans {et}, même si cela n'est généralement pas nécessaire. Ce que je crois que le compilateur C# reconnaît est le paramètre passé à OrderBy en tant qu'expression lambda, puis le compile dans une fonction et crée et transmet le délégué pour vous. Notez que les expressions lambda peuvent également être converties en System.Linq.Expressions.Expression objets (arborescences d'expression accessibles) au lieu de délégués, mais il s'agit d'une utilisation beaucoup moins courante. Quoi qu'il en soit, il se passe beaucoup de choses dans les coulisses ici, mais j'espère que cela devrait au moins clarifier pourquoi le type est Func < TSource, TKey > et comment il se rapporte à l'expression lambda. Comme je l'ai dit, lisez sur MSDN si vous voulez une meilleure compréhension de LINQ/lambdas/délégués ...
Merci pour cela. Cela prend tout son sens maintenant! :) – dotnetdev
Aussi, si je devais d'abord obtenir la chaîne la plus courte, y a-t-il un moyen autre que de dire a => a.Length puis Reverse sur la collection? – dotnetdev
Si vous souhaitez modifier les ordres de tri, consultez OrderBy, OrderByDescending, ThenBy et ThenByDescending. –