views:

961

answers:

4

Hi,

I have an ASP.NET page with a multiline textbox called txbUserName. Then I paste into the textbox 3 names and they are vertically aligned:

  • Jason
  • Ammy
  • Karen

I want to be able to somehow take the names and split them into separate strings whenever i detect the carriage return or the new line. i am thinking that an array might be the way to go. Any ideas?

thank you.

+16  A: 
string[] result = input.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

This covers both \n and \r\n newline types and removes any empty lines your users may enter.

I tested using the following code:

        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);

And it works correctly, splitting into a three string array with entries "PersonA", "PersonB" and "PersonC".

jasonh
Is there a guarantee that this wouldn't first split by \n, leaving \r\n reduced to \r?
spender
I'm pretty sure it won't. I use this line in my app at work and it's used to parse the clipboard one at a time (somehow users have a need for UNIX line-endings on Windows...). However, if it does, I imagine that reversing the strings in the string array argument would solve this. Does anyone know how to generate a mix of the two to test with?
jasonh
@jasonh: "I'm pretty sure"... famous last words. :)
Esteban Araya
Nothing is 100% I guess. :P
o.k.w
@jasonh: with tools and apps being used on both Windows and Linux, the lines are being blurred a bit, and in reality any application running on either should be able to handle either line ending gracefully.
Matthew Scharley
@Esteban Araya: LOL! I revised my answer with test code showing that it passes with flying colors. :)
jasonh
Thanks a lot jasonh, your example is just great. I just tested it and it works great. all the strings are ordered in the array in the same order they were entered too.
Erica
@spender: Of course there's a gurantee. You'll get 3x you money back if you get fired by your boss if the code splits the lines incorrectly. :P
Esteban Araya
If you want to be sure of splitting on all combinations of CR or LF then you can do this: `string[] result = input.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);`
LukeH
A: 

String.Split?

mystring.Split(new Char[] { '\n' })
Thanatos
Thank you. that worked too.
Erica
+4  A: 

Take a look at the String.Split function (not sure of exact syntax, no IDE in front of me).

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

TryCatch
Environment.Newline is the "newline" representation of the server's environment, it doesn't control what the user can input, does it?
o.k.w
If a constant could control what the user could input, well I'd buy more Microsoft stock... a *lot* more.
TryCatch
FWIW - it's better to use "\r" and/or "\n", my answer focuses more on the "just use .split" to break the string up. Just be glad you don't have to write .split in C and manage the memory and pointers yourself! Young whipper-snappers got it easy I tell ya.
TryCatch
@TryCatch: You mean you'd buy Microsoft's stock? :P
Thanatos
+3  A: 

Replace any \r\n with \n, then split using \n:

string[] arr = txbUserName.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
o.k.w
why not use `new char[] { '\n' }` ?
Matthew Scharley
@Matthew: old habits die hard :P
o.k.w
@Matthew, @o.k.w: Or even just use `Split('\n')` since the separator array is a `params` parameter.
LukeH
@luke: you are right. : P
o.k.w