2010-02-10 2 views
50

Quelle est la manière la plus simple d'analyser une liste de valeurs de chaînes délimitées par des virgules dans un type d'objet que je peux parcourir en boucle, de façon à pouvoir accéder facilement aux valeurs individuelles?La manière la plus simple d'analyser une chaîne délimitée par des virgules par une sorte d'objet que je peux parcourir pour accéder aux valeurs individuelles?

exemple chaîne: "0, 10, 20, 30, 100, 200"

Je suis un peu nouveau pour C#, alors pardonnez-moi de poser une question simple comme ça. Merci.

+0

re: ma réponse - si vous les traitez comme des nombres Il existe des stratégies supplémentaires pour les analyser de manière tolérante aux pannes si cela vous intéresse. J'ai commencé à les ajouter - mais j'ai senti que c'était en fait trop d'informations. –

+0

effectivement oui j'ai besoin d'eux comme #s mais je l'ai implémenté tout de suite, c'était facile après avoir suivi votre code. Tout fonctionne bien. Merci! – ycomp

Répondre

123

il y a avec ce gotchas - mais en fin de compte la façon la plus simple sera d'utiliser

string s = [yourlongstring]; 
string[] values = s.Split(','); 

Si le nu mbre des virgules et des entrées est pas important, et que vous voulez vous débarrasser des « vides » des valeurs, vous pouvez utiliser

string[] values = s.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 

Une chose, cependant - cela gardera les espaces blancs avant et après vos cordes. Vous pouvez utiliser un peu de magie Linq pour résoudre que:

string[] values = s.Split(',').Select(sValue => sValue.Trim()).ToArray(); 

C'est si vous utilisez .Net 3.5 et vous avez la déclaration en utilisant System.Linq en haut de votre fichier source.

+0

Il convient de noter qu'une solution regex est également disponible qui permettrait également de faire face aux espaces de chaque côté. Mais c'est l'approche la plus directe. –

+1

ajoutant au commentaire de @ Andras.J'utiliserais aussi l'expression régulière pour m'assurer que chaque valeur est numérique et en retirer d'autres. Modèle? '" (? \ d +) "', alors vous pouvez l'obtenir dans chaque 'Match.Groups [" value "]'. Vous pouvez les convertir en entiers à la volée tout en le faisant aussi. –

+1

J'ai adapté certains d'entre eux pour créer la liste userIds = usersList.Split (','). Sélectionnez (sValue => long.Parse (sValue.Trim())). ToList(); – Manish

17
var stringToSplit = "0, 10, 20, 30, 100, 200"; 

// To parse your string 
    var elements = test.Split(new[] 
    { ',' }, System.StringSplitOptions.RemoveEmptyEntries); 

// To Loop through 
    foreach (string items in elements) 
    { 
     // enjoy 
    } 
+1

belle solution simple. –

6

Utilisez Linq, c'est un moyen très rapide et facile.

string mystring = "0, 10, 20, 30, 100, 200"; 

var query = from val in mystring.Split(',') 
      select int.Parse(val); 
foreach (int num in query) 
{ 
    Console.WriteLine(num); 
} 
+0

try 'int.Parse (val.Trim())' –

+3

N'est-il pas trop exagéré d'utiliser Linq pour cela. .split() retourne un tableau que vous pourriez simplement boucler. Vous ajoutez la complexité de Linq, sans réel bénéfice. Si quoi que ce soit, c'est une lisibilité réduite. –

+0

mais il est facile de comprendre ce qui se passe et le compilateur traduit la requête de la même manière à un arbre d'expression comme si vous utilisiez lambda-querys – martin

4

Le motif correspond à tous les caractères non numériques. Cela vous limitera aux entiers non négatifs, mais pour votre exemple ce sera plus que suffisant.

string input = "0, 10, 20, 30, 100, 200"; 
Regex.Split(input, @"\D+"); 
2

Parfois, les colonnes auront des virgules eux-mêmes, tels que:

« Certains article », « Un autre élément », « En outre, un élément de plus »

Dans ces cas, le fractionnement sur « » va casser quelques colonnes. Peut-être un moyen plus simple, mais je viens de faire ma propre méthode (en bonus, gère les espaces après les virgules et renvoie un IList):

Questions connexes