Parser une ligne de commande avec LINQ (suite)
A la suite de mon précédent post, Fabrice Marguerie (auteur de livre "Linq in Action") m' a envoyé un petit message pour m' indiquer que ma requête :
var NameValues = from arg in args.Where(s => s.StartsWith("/")).Select(s => s.Substring(1))
select new
{
ArgumentName = arg.Substring(0, arg.IndexOf(":")),
ArgumentValue = arg.Substring(arg.IndexOf(":") + 1)
};
pouvait être améliorée. Je voulais donc vous faire part de ses remarques. En effet cette requête utilise les deux modes d' écritures (Query Syntax, Method Syntax). Transformons la, en utilisant uniquement la forme "Query Syntax" :
var NameValues = from arg in args
where arg.StartsWith("/")
select new
{
ArgumentName = arg.Substring(1, arg.IndexOf(":")),
ArgumentValue = arg.Substring(arg.IndexOf(":") + 1)
};
et effectivement c' est plus lisible. Mais il reste encore une amélioration. En effet il y a 2 appels à Substring et IndexOf, pour remplir les propriétés "ArgumentName" et "ArgumentValue". On peut réduire le nombre d' appels and utilisant ce petit mot clé 'let'.
var NameValues = from arg in args
where arg.StartsWith("/")
let parts = arg.Substring(1).Split(new char []{':'},2)
select new
{
ArgumentName = parts[0],
ArgumentValue = parts[1]
};
Très bien mais en termes de "perfs" ???
J' ai donc pris quelques minutes pour comparer ces 3 requêtes LINQ. Pour cela j' ai fait une boucle qui me remplit mon tableau d' arguments
const int nb = 10;
string[] args = new string[nb];
for (int i = 0; i < nb; i++)
args
= string.Format("/swichname{0}:switchvalue{0}", i);
et pour 10 000...
Vous me direz que dans ce genre de situation, il est effectivement très rare voire impensable de passer 10 000 paramètres en ligne de commande....
10 ou 10 000, le résultat reste sans appel, la première solution est donc à bannir :-).
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :