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


92

Який правильний синтаксис для цього:

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

Що я псую? Що означає TSource?

Відповіді:


253

Проблема в тому, що ви дзвоните, 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
Скіт - звір!
плоть

2
добре розроблений, я дуже оцінив!
Gaurav Aroraa

11

Я розумію, що це запитання досить давнє, але у мене була подібна проблема, за винятком того, що в моєму рядку були пробіли. Для тих, хто повинен знати, як відокремити рядок не лише комами:

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

StringSplitOptions видаляє записи, які були б лише пробілом ...


Це не спрацює, якщо у вас був "Том Круз", а не просто Том
горіння


1

Спробуйте це:

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

Я отримую помилку - Неможливо неявно перетворити тип 'void' у 'System.Collections.Generic.List <string>
BuddyJoe

1

Тут вам не вистачає цього .Reverse () - метод порожнечі. Неможливо присвоїти змінній результат .Reverse (). Однак ви можете змінити порядок, використовуючи Enumerable.Reverse () і отримати свій результат

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

Різниця полягає в тому, що Enumerable.Reverse () повертає IEnumerable <T> замість повернення void


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.