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


125

Je veux diviser cette ligne:

string line = "First Name ; string ; firstName";

dans un tableau de leurs versions coupées:

"First Name"
"string"
"firstName"

Comment puis-je tout faire sur une seule ligne? Ce qui suit me donne une erreur "impossible de convertir le type void":

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

2
L'erreur est renvoyée car ForEachfonctionne sur l'instance actuelle de IEnumerableet retourne void.
Majkel

Réponses:


292

Essayer

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

Pour info, la méthode Foreach prend une action (prend T et retourne void) pour le paramètre, et votre lambda renvoie une chaîne sous forme de chaîne.

La méthode d'extension Foreach est destinée à modifier l'état des objets dans la collection. Comme les chaînes sont immuables, cela n'aurait aucun effet

J'espère que ça aide; o)

Cédric


3
Remarque: ForEachn'est pas une méthode d'extension.
Guffa

Meilleure solution à Linq!
Sonhja

Que faire s'il n'y a pas de valeurs renvoie-t-il null?
Demodave

si la ligne est nulle, vous obtenez une exception. si la ligne ne contient pas ';' vous aurez une liste avec une chaîne correspondant à la ligne trimmid
Cédric Rup le

22

La ForEachméthode ne renvoie rien, vous ne pouvez donc pas l'affecter à une variable.

Utilisez Selectplutôt la méthode d'extension:

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

5

Parce que p.Trim () renvoie une nouvelle chaîne.

Vous devez utiliser:

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

3

Essayez également ceci:

string[] parts = Regex.Split(line, "\\s*;\\s*");

C'est une excellente idée, cependant, je pense qu'il manque des blancs à la fin de la chaîne, n'est-ce pas?
jrichview

3

Voici une méthode d'extension ...

    public static string[] SplitAndTrim(this string text, char separator)
    {
        if (string.IsNullOrWhiteSpace(text))
        {
            return null;
        }

        return text.Split(separator).Select(t => t.Trim()).ToArray();
    }

2

essayez d'utiliser Regex:

List<string> parts = System.Text.RegularExpressions.Regex.Split(line, @"\s*;\s*").ToList();

0

Split renvoie le type de chaîne []. Écrivez une méthode d'extension:

public static string[] SplitTrim(this string data, char arg)
{
    string[] ar = data.Split(arg);
    for (int i = 0; i < ar.Length; i++)
    {
        ar[i] = ar[i].Trim();
    }
    return ar;
}

J'ai aimé votre solution, j'ai donc décidé de l'ajouter et de la rendre plus utilisable.

public static string[] SplitAndTrim(this string data, char[] arg)
{
    return SplitAndTrim(data, arg, StringSplitOptions.None);
}

public static string[] SplitAndTrim(this string data, char[] arg, 
StringSplitOptions sso)
{
    string[] ar = data.Split(arg, sso);
    for (int i = 0; i < ar.Length; i++)
        ar[i] = ar[i].Trim();
    return ar;
}

-1

Utiliser Regex

string a="bob, jon,man; francis;luke; lee bob";
			String pattern = @"[,;\s]";
            String[] elements = Regex.Split(a, pattern).Where(item=>!String.IsNullOrEmpty(item)).Select(item=>item.Trim()).ToArray();;			
            foreach (string item in elements){
                Console.WriteLine(item.Trim());

Résultat:

bob

Jon

homme

Francis

Luke

Lee

bob

Expliquer le modèle [,; \ s]: correspond à une occurrence de,; ou caractère d'espace

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.