Obtenez de l'Index du Premier Caractère non-blanc en C# String
Est-il un moyen pour obtenir l'index du premier caractère non-blanc est une chaîne de caractères (ou, plus généralement, l'indice du premier caractère correspondant à un état) en C# sans écrire de ma propre code de boucle?
MODIFIER
Par "l'écriture de mon propre code de boucle", je voulais dire que je suis à la recherche d'un compact expression qui permet de résoudre le problème sans encombrer la logique, que je suis en train de travailler sur.
Je m'excuse pour la confusion sur ce point.
- Êtes-vous familier avec la RegEx?
- Oui, mais franchement, j'ai tendance à les éviter. Probablement déraisonnable biais lié au fait que j'ai tendance à travailler sur le rendement de code critique dans ma carrière, et d'une expression régulière est généralement pas la solution la plus rapide. Accordé, parfois, il peut être la meilleure solution dans une situation donnée.
- Ma réponse est la plus courte et la plus simple des solutions. int pos = myString.ToList<char>().FindIndex(x => char.IsWhiteSpace(x) == false);
Vous devez vous connecter pour publier un commentaire.
J'aime à définir mon propre méthode d'extension pour le retour à l'index du premier élément qui satisfait à l'une coutume de prédicat dans une séquence.
Vous pouvez ensuite utiliser LINQ pour traiter votre problème d'origine:
String
a déjà un du même nom.str.IndexOf(...)
va utiliser la non-générique version définie dans le cadre (et j'ai édité la réponse à l'appel de la version générique 🙂String.IndexOf
, il est donc acceptable pour qu'il apparaisse comme une autre surcharge.<char>
n'est pas nécessaire. Encore un nom commeIndexOfWhere()
peut être plus clair.Un
string
est bien sûr unIEnumerable<char>
de sorte que vous pouvez utiliser Linq:renvoie 6
Pour ajouter une condition venons de le faire ...
Si vous allez faire cela souvent, pour des raisons de performances, vous devriez cache la compilation des
Regex
pour ce motif, par exemple:De l'utiliser ensuite comme:
var index = match.Success ? match.Index : -1;
(ou(int?)null
oudefault(int?)
si vous préféreznull
sur-1
pour un non-match). @lcfseth bon point. Le demandeur a demandé pas de boucle, et "de façon plus générale, l'indice du premier caractère correspondant à un état", qui ressemble plus à de la regex que pas. Pour quelque chose d'aussi simple que "espaces", je serais d'accord avec vous, mais cela pourrait être utile dans d'autres cas.Vous pouvez utiliser le Chaîne de caractères.IndexOfAny fonction qui renvoie la première occurrence d'un caractère dans un tableau spécifié de caractères Unicode.
Alternativement, vous pouvez utiliser le Chaîne de caractères.TrimStart fonction supprimer tous les caractères blancs depuis le début de la chaîne. L'indice de la première non-caractère espace blanc est la différence entre la longueur de la chaîne d'origine et taillée une.
Vous pouvez même choisir un ensemble de caractères pour la garniture 🙂
En gros, si vous êtes à la recherche pour un nombre limité de caractères (disons chiffres), vous devriez aller avec la première méthode.
Si vous êtes en essayant d'ignorer un ensemble limité de caractères (comme les espaces blancs), vous devriez aller avec la deuxième méthode.
Une Dernière méthode consiste à utiliser le Linq méthodes:
De sortie:
Puisqu'il existe plusieurs solutions ici, j'ai décidé de faire des tests de performance pour voir comment chacun fonctionne. Décidé de partager ces résultats pour ceux qui sont intéressés...
Résultats sont en millisecondes....
Où s = "\t Test"
Convertir en char tableau et utiliser FindIndex:
154
Garniture d'espaces et d'obtenir l'indice du premier caractère:
189
L'utilisation de la méthode d'extension:
234
Boucle:
146
Où s = "Test"
Convertir en char tableau et utiliser FindIndex:
39
Garniture d'espaces et d'obtenir l'indice du premier caractère:
155
L'utilisation de la méthode d'extension:
57
Boucle:
15
Où s = (1000 chaîne de caractères sans les espaces)
Convertir en char tableau et utiliser FindIndex:
506
Garniture d'espaces et d'obtenir l'indice du premier caractère:
534
L'utilisation de la méthode d'extension:
51
Boucle:
15
Où s = (1000 chaîne de caractères qui commence par "\t Test")
Convertir en char tableau et utiliser FindIndex:
609
Garniture d'espaces et d'obtenir l'indice du premier caractère:
1103
L'utilisation de la méthode d'extension:
226
Boucle:
146
Vous pouvez couper, obtenir le premier caractère et d'utiliser IndexOf.
Il y a une solution très simple
pos sera de 4
vous pouvez avoir plus de conditions complexes comme:
return (x == 's');
Oui, vous pouvez essayer ceci:
Chose va être en boucle quelque part. Pour un contrôle total sur ce qui est et n'est pas l'espace que vous pourriez utiliser linq to objects pour faire de votre boucle:
Il y a beaucoup de solutions ici que convertir la chaîne en un tableau. Ce n'est pas nécessaire, les différents caractères dans une chaîne de caractères peut être consulté, tout comme les éléments dans un tableau.
C'est ma solution qui devrait être très efficace:
Et à les utiliser, procédez de la manière suivante: