web-dev-qa-db-fra.com

Effectuer Trim () tout en utilisant Split ()

aujourd'hui, je me demandais s'il y avait une meilleure solution pour effectuer l'exemple de code suivant.

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in split)
{
  if(s.Trim() == match){// asjdklasd; break;}
}

Existe-t-il un moyen d'effectuer un trim () sans parcourir manuellement chaque élément? Je cherche quelque chose comme "divisé par les caractères suivants et découper automatiquement chaque résultat".

Ah, juste avant de poster j'ai trouvé

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

in Comment puis-je diviser et couper une chaîne en parties sur une seule ligne?

Je suis toujours curieux: pourrait-il y avoir une meilleure solution à cela? (Ou le compilateur les convertirait-il probablement en la même sortie de code que l'opération Linq?)

50
citronas

Une autre option possible (qui évite LINQ, pour le meilleur ou pour le pire):

string line = " abc, foo  ,     bar";
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim());

Cependant, si vous avez juste besoin de savoir s'il existe - peut-être un court-circuit?

bool contains = line.Split(',').Any(p => p.Trim() == match);
80
Marc Gravell

Si des espaces entourent juste les mots dans la chaîne séparée par des virgules, cela fonctionnera:

var keyword = " abc, foo  ,     bar";
var array = keyword.Replace(" ", "").Split(',');
if (array.Contains("foo"))
{
    Debug.Print("Match");
}
4
Jens Granlund

Je suggérerais d'utiliser des expressions régulières sur la chaîne d'origine, en recherchant le modèle "n'importe quel nombre d'espaces suivi par l'un de vos délimiteurs suivi par un ou plusieurs espaces" et supprimer ces espaces. Ensuite, divisez.

3
MikeW

Essaye ça:

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*");
if (split.Contains(match))
{
    // do stuff
}
3
Rubens Farias
var parts = line.Split(';').Select(p => p.Trim()).Where(p => !string.IsNullOrWhiteSpace(p)).ToArray();
2
Darius Kucinskas

Vous allez trouver beaucoup de méthodes différentes pour ce faire et le changement de performance et la précision ne seront pas facilement apparents. Je recommanderais de les brancher tous dans une suite de tests comme NUnit afin de trouver lequel est le meilleur et lesquels sont précis.

Utilisez de petites, moyennes et grandes quantités de texte en boucles pour examiner les différentes situations.

1
McAden