C# Syntax - Split String into Array by Comma, Convert To Generic List, and Reverse Order
Asked Answered
S

6

102

What is the correct syntax for this:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

What am I messing up? What does TSource mean?

Snakebite answered 24/11, 2008 at 20:30 Comment(0)
I
269

The problem is that you're calling List<T>.Reverse() which returns void.

You could either do:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

or:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

The latter is more expensive, as reversing an arbitrary IEnumerable<T> involves buffering all of the data and then yielding it all - whereas List<T> can do all the reversing "in-place". (The difference here is that it's calling the Enumerable.Reverse<T>() extension method, instead of the List<T>.Reverse() instance method.)

More efficient yet, you could use:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

This avoids creating any buffers of an inappropriate size - at the cost of taking four statements where one will do... As ever, weigh up readability against performance in the real use case.

Interstitial answered 24/11, 2008 at 20:35 Comment(1)
well elaborated, I really appreciated!Rhodonite
B
14

I realize that this question is quite old, but I had a similar problem, except my string had spaces included in it. For those that need to know how to separate a string with more than just commas:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

The StringSplitOptions removes the records that would only be a space char...

Bienne answered 5/7, 2012 at 7:31 Comment(1)
This won't work if you had "Tom Cruise" instead just TomHoenack
S
5
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

This one works.

Sontich answered 24/11, 2008 at 20:37 Comment(0)
G
2

Try this:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Glitter answered 24/11, 2008 at 20:33 Comment(1)
I get the error - Cannot implicitly convert type 'void' to 'System.Collections.Generic.List<string>Snakebite
S
1

What your missing here is that .Reverse() is a void method. It's not possible to assign the result of .Reverse() to a variable. You can however alter the order to use Enumerable.Reverse() and get your result

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

The difference is that Enumerable.Reverse() returns an IEnumerable<T> instead of being void return

Shifra answered 24/11, 2008 at 20:37 Comment(0)
H
1

If you are trying to

  1. Use multiple delimiters
  2. Filter any empty strings
  3. Trim leading/trailing spaces

following should work:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str.Split(new char[] {',', '|', ' '}, StringSplitOptions.RemoveEmptyEntries);

Output

  • Tom
  • Cruise
  • Scott
  • Bob
  • at

Now you can obviously reverse the order as others suggested.

Hoenack answered 21/8, 2017 at 14:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.