2010-01-11 8 views
1

J'ai une chaîne dans ce format: "ABC_123_"Quel est le moyen le plus efficace de séparer l'entier de cette chaîne?

Je veux terminer avec une variable entière qui est juste la partie numérique de la chaîne. Quel est le moyen le plus efficace d'accomplir cela en C#?

+0

Que pouvez-vous nous dire au sujet du format de chaîne? –

+0

Y a-t-il une raison pour laquelle vous vous inquiétez de l'efficacité? La chaîne que vous avez postée ne contient que quelques caractères, donc je ne vois pas le besoin d'efficacité: tout va bien se passer. Sauf si vous ne nous avez pas dit une partie essentielle de votre problème. Travaillez-vous sur un ordinateur des années 80? La chaîne est-elle en réalité composée de centaines de milliers de caractères? –

+0

Efficent peut ne pas avoir été le meilleur mot à utiliser. Je veux le code le plus court, pas nécessairement la meilleure performance. J'utilisais 3 lignes pour faire ceci qui m'embêtait esthétiquement. –

Répondre

8

Cela devrait être assez efficace. Ne pas transpirer si ce n'est pas le plus efficace à moins que le profilage vous dit qu'il est un goulot d'étranglement de votre application:

string s = "ABC_123_"; 
int i = Int32.Parse(s.Split('_')[1]); 

Sans plus d'informations sur votre problème, ce que je voudrais aller avec.

-1

Si l'entrée de votre chaîne sera toujours sous la même forme de ABC_123_ alors cela fonctionnera

int i = Int32.Parse("ABC_123_".Substring(4, 3)); 
+0

J'espère que vous ne donnerez jamais cette réponse lors d'une interview. –

+0

@bnaffas: Pourriez-vous fournir des commentaires supplémentaires? – clichekiller

0

Si la longueur de votre chaîne, etc. sont fixes, vous pouvez utiliser String.substring.

Plus votre chaîne est compliquée, plus vous devez utiliser Regex.

1

Voici un moyen. Je ne sais pas « plus efficace », mais il devrait fonctionner:

int? GetJustIntPart(string original) 
{ 
    var split = original.Split('_'); 
    int test; 
    foreach (var item in split) 
    { 
     if (int.TryParse(item, out test)) 
      return test; 
    } 
    return null; 
} 
+0

Cela fonctionnera quel que soit l'endroit où la partie numérique est, au lieu de compter sur elle étant dans une certaine position. Cela ne renverra la * première * partie numérique, cependant, si vous en avez plus d'un. –

3

exemple RegEx obligatoire pour correspondre à tous les numéros dans une chaîne:

int num = Convert.ToInt32(Regex.Match("ABC_123_", @"\d+").Value); 

changement pour vous assurer qu'il est entouré par _:

int num = Convert.ToInt32(Regex.Match("ABC_123_", @"(?<=_)\d+(?=_)").Value); 

note: la valeur peut être null/vide si votre chaîne d'entrée est dans un format incorrect, utilisez donc int.TryParse ou try/catch etc.

+1

beaucoup mieux de simplement utiliser 'Regex.Match (" ABC_123_ ", @" _ (\ d +) _ "). Groupes [1]' à la place de lookaround dans cette situation imo. –

+0

Vrai, bien que je ne connaisse pas les performances, en particulier lors de l'utilisation de Regex compilé. –

2

J'irais avec int i = int.Parse(Regex.Match(string,@"\d+"));

Questions connexes