indexof code>,
indexofany code> et
lastIndexof code>,
lastIndexofany code> ne semble pas faire ces (ou peut-être qu'ils font). Je cherche l'équivalent de STD :: String's
Find_First_Not_of CODE> et
FIND_LAST_NOT_OF CODE>. Je pense à créer une classe d'extension mais je ne sais pas si c # fournit déjà cette fonctionnalité. P>
3 Réponses :
Si l'utilisation de LINQ est acceptable, vous pouvez appeler le premier () et Dernier () Méthodes avec le prédicat approprié.
Par exemple, si vous voulez que les premier et les derniers caractères ne soient pas voyelles: p> edit: strong> Ce qui précède retournera les caractères, non leurs index. Pour ce faire, vous pouvez projeter les index à l'aide du Sélectionnez () A > Méthode, mais les choses vont devenir poilues car nous devons retourner alternativement, voici une solution moins compliquée Réponse de @ Abatishchev: P> -1 code> si aucun caractère correspond: p>
string vowels = "aeiouy";
int firstIndex = yourString.IndexOf(yourString.First(
ch => vowels.IndexOf(ch) < 0));
int lastIndex = yourString.LastIndexOf(yourString.Last(
ch => vowels.IndexOf(ch) < 0));
Pas exactement: wind_first_not_of code> renvoie la position, pas le personnage.
Je pense que Linq surcharge des choses. Et cette solution est très inefficace. Nous créons beaucoup d'objets temporaires de type anonyme et d'itérateurs. Méthode d'écriture qui fait simple pour la boucle sera meilleure.
Vous voulez probablement utiliser les méthodes d'extension de SleeTeDefault et de FirstOrdefault pour supprimer la lancée des exceptions. Ou il me manque quelque chose?
@DMitry, puisque j'utilise des types anonymes, ces méthodes de retourneraient null code> et l'accès ultérieur à l'index code> code> échoueraient. Puisque je voulais retourner
-1 code> dans ce contexte, j'ai dû créer une instance explicite du type anonyme avec
index code> défini sur
-1 code>. Je suis d'accord que ça sort de la main, cependant :)
int? firstNotOf = source.FindFirstNotOf(chars); int? lastNotof = source.FindLastNotOf(chars); // ... public static int? FindFirstNotOf(this string source, string chars) { if (source == null) throw new ArgumentNullException("source"); if (chars == null) throw new ArgumentNullException("chars"); if (source.Length == 0) return null; if (chars.Length == 0) return 0; for (int i = 0; i < source.Length; i++) { if (chars.IndexOf(source[i]) == -1) return i; } return null; } public static int? FindLastNotOf(this string source, string chars) { if (source == null) throw new ArgumentNullException("source"); if (chars == null) throw new ArgumentNullException("chars"); if (source.Length == 0) return null; if (chars.Length == 0) return source.Length - 1; for (int i = source.Length - 1; i >= 0; i--) { if (chars.IndexOf(source[i]) == -1) return i; } return null; }
Beau travail, mais qui, dans leur bon esprit, trouve l'une de ces personnes acceptables sur une routine de bibliothèque ou d'API? On dirait qu'une MS échoue.
Voici une solution de regex.
string testString = "oueytestie"; var matchFirstNotOf = Regex.Match(testString, @"[^aeiouy]"); int firstNotOf = matchFirstNotOf.Success ? matchFirstNotOf.Index : -1; var matchLastNotOf = Regex.Match(testString, @"[^aeiouy]", RegexOptions.RightToLeft); int lastNotOf = matchLastNotOf.Success ? matchLastNotOf.Index : -1;