2010-10-19 5 views
2

J'ai une variable de chaîne déclarée globalement. Je dois ajouter une sous-chaîne à cette chaîne dynamiquement en fonction de l'entrée de l'utilisateur. Pour ce faire, j'utilise str = str + substring;manipulations de chaînes

Dans ce cas, la chaîne str n'a pas de sens enfin phrase-à-dire., Il n'y a pas d'espace entre le words.to faire sens, j'utilisé au lieu de la déclaration suivante,

str = str + » « + sous-chaîne; ou str = str + substring + "";

ici chaque fois que je dois ajouter de l'espace supplémentaire à la sous-chaîne avant d'ajouter ceci à la chaîne principale où un traitement de chaîne supplémentaire est requis.

Quelqu'un peut-il aider à ce que je peux le faire efficacement?

Répondre

6

Cela dépend de la fréquence à laquelle vous le faites. Si cela est intermittent (ou en fait à peu près tout sauf une boucle serrée), alors oubliez-le; ce que vous avez est bien. Bien sûr une chaîne supplémentaire est générée occasionnellement (la sous-chaîne/l'espace combiné), mais elle sera collectée à la génération 0; très bon marché.

Si vous faites cela agressivement (dans une boucle, etc.), puis utiliser un StringBuilder à la place:

// declaration 
StringBuilder sb = new StringBuilder(); 
... 
// composition 
sb.Append(' ').Append(substring); 
... 
// obtaining the string 
string s = sb.ToString(); 

Une finale (sans lien) le point - re "globalement" - si vous voulez dire static, vous peut vouloir synchroniser l'accès si vous avez plusieurs threads.

+1

StringBuilder est peut-être trop puissant si vous ne concaténéz que quelques chaînes de façon peu fréquente en raison du coût de construction. Il était idiomatique d'utiliser le générateur de chaîne pour concaténer les chaînes afin d'éviter la complexité quadratique du pire cas dû à la copie de chaîne, mais les compilateurs C# plus récents sont devenus assez intelligents pour transformer les chaînes de concaténations de chaînes en appels String.Concat de sorte que toute l'opération se fasse en temps linéaire. – Stewart

+1

@Stewart - cela a été le cas pendant un certain temps, mais ne s'applique qu'aux déclarations simples; aussi, j'ai déjà souligné les deux différents scénarios ici (basé sur la fréquence) –

+0

Oh oui - je n'ai pas lu la première phrase correctement. Merci de confirmer. Je pense que cela vaut la peine de faire valoir ce point. Dans beaucoup d'endroits, il est toujours considéré comme une question de foi aveugle que l'on devrait éviter la concaténation de chaînes en faveur de StringBuilder partout, même si StringBuilder est susceptible d'être beaucoup plus cher. La raison de la complexité quadratique est toujours citée même si elle n'a pas été vraie depuis un certain temps, comme vous le dites. – Stewart

3

Que voulez-vous atteindre exactement? Vous pouvez stocker les mots dans une liste

List<string> words = new List<string>(); 
... 
words.Add(str); 

Et puis retarder la manipulation de chaîne (par exemple l'ajout d'espaces entre les mots) jusqu'à à la fin. De cette façon, vous êtes à la volée est juste un ajout à une liste, et vous pouvez faire tout le traitement complexe (quel qu'il soit) à la fin.

+0

(+1).Dans ce cas, nous pouvons construire la 'chaîne' finale en utilisant la fonction aggrigate comme' String str = mots.Aggregate ((X1, X2) => X1 + "" + X2); ' –

+0

@Pramodh: Je suppose, mais pourquoi nous vouloir? –

+0

@ Steven Sudit: Parce que mrnye ajoute les chaînes à une liste. Donc, la liste contra 'str',' Substring1', 'substring2' .... Mais Nanda a besoin d'une seule chaîne (Comme je l'ai compris) –

0

@Nanda: dans votre cas, utilisez un générateur de chaînes.

StringBuilder data = new StringBuilder(); 
data.AppendFormat(" {0}", substring); 
+0

Si vous vous souciez de la performance, vous devriez éviter cela. Votre code devra analyser la chaîne de format à l'exécution, ce qui a un coût. Les réponses de Jamie et Marc seront plus rapides que cela. – Stewart

1

Si vous le faites rarement, vous pourriez peu à peu le code en faisant:

str += " " + substring; 

Sinon, je partirais avec la solution de Nanda.

Questions connexes