C# les paramètres Nommés pour une chaîne de remplacer les valeurs de paramètre
Je veux une bonne performance moyen (je l'espère) remplacer un paramètre nommé dans ma chaîne de caractères à un paramètre nommé à partir du code, exemple, ma chaîne:
"Hi {name}, do you like milk?"
Comment pourrais-je remplacer les {nom} par le code, les expressions Régulières? Pour cher? De quelle manière avez-vous recommander?
Comment font-ils dans l'exemple NHibernates HQL pour remplacer :my_param à la valeur définie par l'utilisateur? Ou dans ASP.NET (MVC) de Routage que j'aime le mieux, "{controller}/{action}", new { controller = "Bonjour", ... }?
OriginalL'auteur | 2008-12-18
Vous devez vous connecter pour publier un commentaire.
Avez-vous vérifié que les expressions régulières sont trop cher?
Le coût des expressions régulières est grandement exagérée. Pour un modèle simple, le rendement sera très bon, probablement que légèrement moins bon que la recherche directe-et-remplacer, en fait. Aussi, avez-vous expérimenté avec la
Compiled
drapeau lors de la construction de l'expression régulière?Cela dit, tu ne peux pas utiliser de la façon la plus simple, c'est à dire
Replace
?(Bien que tu veux dire Remplacer(modèle, "Mike"))
Merci. Pourquoi utiliser un compilateur quand vous avez un Jon? 😉
OriginalL'auteur Konrad Rudolph
Regex est certainement une option viable, surtout avec un
MatchEvaluator
:Si vous êtes sur .NET 3.5, vous pouvez tuer le délégué mot-clé. délégué(Match Match) peut être match =>
pour être exact, c'est C# 3.0, pas .NET 3.5; il fonctionnerait mieux les cibler .NET 2.0 avec C# 3.0, trop.
OriginalL'auteur Marc Gravell
Maintenant, si vous avez-vous des remplacements dans un dictionnaire, comme ceci:
puis la Regex est assez simple:
la haine regexes, mais c'est assez agréable.
OriginalL'auteur James Curran
Après réflexion sur ce sujet, j'ai réalisé ce que je souhaite, était de cette Chaîne.Format() prend un IDictionary comme argument, et que les modèles pourraient être écrites à l'aide des noms au lieu de index.
Pour la substitution de chaîne avec beaucoup de possible de clés/valeurs, les numéros d'index de résultat dans illisible chaîne de modèles - et, dans certains cas, vous pouvez même ne pas connaître les éléments qui vont avoir ce numéro, alors je suis venu avec l'extension suivante:
https://gist.github.com/896724
En gros, cela vous permet d'utiliser la chaîne de modèles avec des noms plutôt que des numéros, et un dictionnaire au lieu d'un tableau, et vous permet d'avoir toutes les autres bonnes caractéristiques de Chaîne de caractères.Format(), permettant l'utilisation d'une coutume IFormatProvider, si nécessaire, et en permettant l'utilisation de tous les types de mise en forme de la syntaxe de précision, la longueur, etc.
La exemple fourni dans le matériel de référence pour la Chaîne.Le Format est un excellent exemple de la façon dont les modèles avec de nombreux éléments numérotés devenu complètement illisible - le portage de cet exemple pour utiliser cette nouvelle méthode d'extension, vous obtenez quelque chose comme ceci:
Comme quelqu'un l'a souligné, si ce que vous écrivez doit être hautement optimisée, ne pas utiliser quelque chose comme ça - si vous avez du format des millions de chaînes de cette façon, dans une boucle, de la mémoire et des performances pourraient être importants.
D'autre part, si vous êtes inquiet au sujet de l'écriture lisible, maintenable code - et si vous êtes en train de faire, de dire, un tas d'opérations de base de données, dans le grand schéma des choses, cette fonction ne sera pas ajouter une surcharge importante.
...
Pour des raisons de commodité, j'ai essayer d'ajouter une méthode qui permettrait d'accepter un objet anonyme au lieu d'un dictionnaire:
Pour une raison quelconque, cela ne fonctionne pas - le passage d'un objet anonyme comme
new { name: "value" }
pour cette extension de la méthode donne une erreur de compilation message disant que le meilleur match a été le IDictionary version de cette méthode. Vous ne savez pas comment résoudre ce problème. (quelqu'un?)Je ne me souviens pas - c'était il y a longtemps, et je n'ai pas actuellement de travailler avec ASP.NET... j'ai regardé le code de l'époque, et il est entré en production à la recherche de la même chose - je vaguement rappeler le problème étant de toute façon pas avec ce code, mais avec le consommateur-code. C'est le meilleur indice que je peux vous donner.
OriginalL'auteur mindplay.dk
Comment sur
Vous pouvez même avoir plusieurs arguments, juste incrémenter le {x} et ajouter un autre paramètre à la méthode Format (). Pas sûr que l'différents mais tous les deux "chaîne" et "Chaîne" de cette méthode.
OriginalL'auteur sosdude
Constitué à partir des regex pourrait faire l'affaire , surtout si il y a beaucoup de jetons d'être remplacé. Si il y a juste une poignée d'entre eux et de la performance est la clé, je voudrais simplement trouver le jeton à l'index et de le remplacer à l'aide de fonctions de chaînes de caractères. Le croire ou pas ce sera plus rapide que d'une expression régulière.
OriginalL'auteur Andrew Hare
Essayez d'utiliser StringTemplate. Il est beaucoup plus puissant que cela, mais il fait le travail sans faille.
OriginalL'auteur
ou essayer avec Linq si vous avez toutes vos remplacer les valeurs stockées dans un Dictionnaire obj.
Par exemple:
dict est votre rechercher-remplacer les paires défini dans le Dictionnaire de l'objet.
str est votre chaîne dont vous avez besoin de faire quelques remplacements.
OriginalL'auteur Allen Wang
Je pencherais pour la mindplay.dk solution... Fonctionne très bien.
Et, avec une légère modification, il prend en charge les modèles de modèles de, comme
"Salut {nom}, avez-vous comme {0}?", remplacement de {nom} mais en conservant {0}:
Dans la source donnée (https://gist.github.com/896724), la remplacer comme suit:
En outre, il prend en charge une longueur ({nom,30}) ainsi que d'un formatspecifier, ou une combinaison des deux.
OriginalL'auteur Edwin