Bien qu'il y ait quelques cas où j'écrirai quelque chose en utilisant les chaînes de méthodes (surtout s'il ne s'agit que d'une ou deux méthodes, comme foo.Where(..).ToArray()), dans de nombreux cas, je préfère la syntaxe de compréhension des requêtes LINQ ("expressions de requêtes" dans la spécification) :
var query =
from filePath in Directory.GetFiles(directoryPath)
let fileName = Path.GetFileName(filePath)
let baseFileName = fileName.Split(' ', '_').First()
group filePath by baseFileName into fileGroup
select new
{
BaseFileName = fileGroup.Key,
Count = fileGroup.Count(),
};
Dans un nombre assez important d'entre eux, je dois prendre le IEnumerable résultant et le charger dans une structure de données (tableau, liste, etc.). Cela signifie généralement soit :
-
ajouter une autre variable locale comme var queryResult = query.ToArray() ; ou
-
envelopper la requête avec des parenthèses et la baliser avec ToArray (ou ToList ou autre).
var query = ( from filePath in Directory.GetFiles(directoryPath) let fileName = Path.GetFileName(filePath) let baseFileName = fileName.Split(' ', '_').First() group filePath by baseFileName into fileGroup select new { BaseFileName = fileGroup.Key, Count = fileGroup.Count(), } ).ToArray();
J'essaie de trouver quelles sont les options que d'autres 1) utilisent déjà ou 2) pourraient considérer comme faisables pour avoir des "mots-clés contextuels" supplémentaires - juste des choses qui se transformeraient en méthodes d'extension de la même manière que les méthodes existantes, comme si les mots-clés LINQ étaient "nativement" extensibles :)
Je me rends compte que cela va probablement impliquer soit une sorte de prétraitement (je ne suis pas sûr de ce qui existe dans ce domaine pour C#), soit une modification du compilateur utilisé pour quelque chose comme Nemerle (Je pense que ce serait une option, mais je n'en suis pas vraiment sûr ). Je n'en sais pas encore assez sur ce que Roslyn supporte/supportera, donc si quelqu'un sait s'il pourrait permettre à quelqu'un d'"étendre" C# de cette façon, merci de nous le dire !
Ceux que j'utiliserais probablement le plus (bien que je sois sûr qu'il y en ait beaucoup d'autres, mais juste pour faire passer l'idée / ce que j'espère) :
compte - se transforme en Count()
int zFileCount =
from filePath in Directory.GetFiles(directoryPath)
where filePath.StartsWith("z")
select filePath ascount;
Cela se "transformerait" (peu importe le chemin, tant que le résultat final l'est) en :
int zFileCount = (
from filePath in Directory.GetFiles(directoryPath)
where filePath.StartsWith("z")
select filePath
).Count();
De même :
- asarray - se transforme en ToArray()
- aslist - se transforme en ToList()
(vous pourriez évidemment continuer à utiliser First(), Single(), Any(), etc., mais j'essaie de limiter l'étendue des questions :)
Je ne suis intéressé que par les méthodes d'extension qui ne nécessitent pas le passage de paramètres. Je ne cherche pas à essayer de faire ce genre de choses avec (par exemple) ToDictionary ou ToLookup. :)
Donc, en résumé :
- je veux ajouter 'ascount', 'aslist' et 'asarray' dans les expressions de requêtes linq.
- Je ne sais pas si cette question a déjà été résolue.
- je ne sais pas si Nemerle est un bon choix pour cela
- Je ne sais pas si l'histoire de Roslyn supporterait ce genre d'utilisation.