Синтаксис С# - разделение строки на массив по запятой, преобразование в общий список и обратный порядок

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

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

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

Ответ 1

Проблема заключается в том, что вы вызываете 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();

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Попробуйте следующее:

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

Ответ 5

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

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

Разница заключается в том, что Enumerable.Reverse() возвращает IEnumerable <T> вместо того, чтобы быть недействительным return

Ответ 6

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

  • Использование нескольких разделителей
  • Отфильтровать любые пустые строки
  • Обрезать ведущие/конечные пробелы

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

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
  • Круиз
  • Скотт
  • Bob
  • в

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