Синтаксис C # - разбить строку на массив запятой, преобразовать в общий список и в обратном порядке - PullRequest
84 голосов
/ 24 ноября 2008

Какой правильный синтаксис для этого:

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

Что я испортил? Что означает TSource?

Ответы [ 6 ]

229 голосов
/ 24 ноября 2008

Проблема в том, что вы звоните List<T>.Reverse(), который возвращает void.

Вы можете сделать:

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

или

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

Последний является более дорогим, так как обращение произвольного IEnumerable<T> включает в себя буферизацию всех данных и затем их получение - тогда как List<T> может сделать все обращение "на месте". (Разница здесь в том, что он вызывает метод расширения Enumerable.Reverse<T>() вместо метода экземпляра List<T>.Reverse().)

Еще эффективнее, вы можете использовать:

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

Это позволяет избежать создания каких-либо буферов неподходящего размера - за счет принятия четырех операторов, из которых один будет делать ... Как всегда, взвесьте удобочитаемость и производительность в реальном случае использования.

10 голосов
/ 05 июля 2012

Я понимаю, что этот вопрос довольно старый, но у меня была похожая проблема, за исключением того, что в моей строке были пробелы. Для тех, кому нужно уметь разделять строку не только запятыми:

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

StringSplitOptions удаляет записи, которые были бы только пробелом ...

3 голосов
/ 24 ноября 2008
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Этот работает.

1 голос
/ 21 августа 2017

Если вы пытаетесь

  1. Использовать несколько разделителей
  2. Фильтр любых пустых строк
  3. Отделка начальных / конечных пробелов

должно работать следующее:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

выход

  • Tom
  • Круиз
  • Scott
  • Bob
  • в

Теперь вы можете явно изменить порядок, как предлагали другие.

1 голос
/ 24 ноября 2008

Что вам здесь не хватает, так это .Reverse () - метод void. Невозможно присвоить результат .Reverse () переменной. Однако вы можете изменить порядок, чтобы использовать Enumerable.Reverse () и получить свой результат

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

Разница в том, что Enumerable.Reverse () возвращает IEnumerable вместо того, чтобы быть void return

1 голос
/ 24 ноября 2008

Попробуйте это:

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