web-dev-qa-db-fra.com

Comment diviser des chaînes au retour chariot avec C #?

J'ai une page ASP.NET avec une zone de texte multiligne appelée txbUserName. Ensuite, je colle dans la zone de texte 3 les noms et ils sont alignés verticalement:

  • Jason
  • Ammy
  • Karen

Je veux pouvoir en quelque sorte prendre les noms et les scinder en chaînes séparées chaque fois que je détecte le retour chariot ou la nouvelle ligne. Je pense qu'un tableau pourrait être la voie à suivre. Des idées?

je vous remercie. 

52
Erica
string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

Ceci couvre à la fois les types de nouvelle ligne\n et\r\n et supprime les lignes vides que vos utilisateurs peuvent entrer.

J'ai testé en utilisant le code suivant:

        string test = "PersonA\nPersonB\r\nPersonC\n";
        string[] result = test.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
        foreach (string s in result)
            Console.WriteLine(s);

Et cela fonctionne correctement, en se divisant en un tableau de trois chaînes avec les entrées "PersonA", "PersonB" et "PersonC".

119
jasonh

Remplacez tout \r\n par \n, puis divisez-le à l'aide de \n:

string[] arr = txbUserName.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
6
o.k.w

Jetez un coup d'œil à la fonction String.Split (pas sûr de la syntaxe exacte, pas de IDE devant moi).

string[] names = txbUserName.Text.Split(Environment.Newline);
4
TryCatch

String.Split?

mystring.Split(new Char[] { '\n' })
1
Thanatos
using System.Text;
using System.Text.RegularExpressions;


 protected void btnAction_Click(object sender, EventArgs e)
    {
        string value = txtDetails.Text;
        char[] delimiter = new char[] { ';','[' };
        string[] parts = value.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
        for (int i = 0; i < parts.Length; i++)
        {
            txtFName.Text = parts[0].ToString();
            txtLName.Text = parts[1].ToString();
            txtAge.Text = parts[2].ToString();
            txtDob.Text = parts[3].ToString();
        }
    }
1
Rubi

Cela dépend de ce que vous voulez faire. Une autre option, qui est probablement excessive pour les petites listes, mais qui peut être plus efficace en termes de mémoire pour les grandes chaînes, consiste à utiliser la classe StringReader et à utiliser un énumérateur:

IEnumerable<string> GetNextString(string input)
{
    using (var sr = new StringReader(input))
    {
        string s;
        while ((s = sr.ReadLine()) != null)
        {
            yield return s;
        }
    }
}

Ceci prend en charge les fins de ligne \n et \r\n. Comme il retourne un IEnumerable, vous pouvez le traiter avec un foreach ou utiliser l’une des extensions linq standard (ToList(), ToArray(), Where, etc.).

Par exemple, avec foreach:

var ss = "Hello\nworld\r\ntwo bags\r\nsugar";
foreach (var s in GetNextString(ss))
{
    Console.WriteLine("==> {0}", s);
}
0
Chris J

Essaye ça:

message.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

Fonctionne si:

var message = "test 1\r\ntest 2";

Ou

var message = "test 1\ntest 2";

Ou

var message = "test 1\rtest 2";
0
Tovich