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


92

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

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

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

Ответы:


254

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

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


25
Скит зверь!
flesh

2
хорошо проработано, я очень признателен!
Gaurav Aroraa

11

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

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

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


Это не будет работать , если вы были «Том Круз» , а не только Том
пылать


2

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

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

Я получаю сообщение об ошибке - Невозможно неявно преобразовать тип void в System.Collections.Generic.List <string>
BuddyJoe

1

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

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

Разница в том, что Enumerable.Reverse () возвращает IEnumerable <T> вместо void return


1

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

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

Выход

  • Том
  • Морское путешествие
  • Скотт
  • Боб
  • в

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.