Składnia języka C # - podziel ciąg na tablicę za pomocą przecinka, konwertuj na listę ogólną i odwróć kolejność

92

Jaka jest poprawna składnia tego:

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

Co ja psuję? Co oznacza TSource?

BuddyJoe
źródło

Odpowiedzi:

254

Problem w tym, że dzwonisz, List<T>.Reverse()który wraca void.

Możesz zrobić:

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

lub:

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

Ta ostatnia jest droższa, ponieważ odwrócenie arbitralności IEnumerable<T>wymaga buforowania wszystkich danych, a następnie ich udostępnienia - podczas gdy List<T>można wykonać wszystkie odwrócenie „na miejscu”. (Różnica polega na tym, że wywołuje Enumerable.Reverse<T>()metodę rozszerzenia zamiast List<T>.Reverse()metody instancji).

Jeszcze wydajniejszy, możesz użyć:

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

Pozwala to uniknąć tworzenia jakichkolwiek buforów o niewłaściwym rozmiarze - kosztem wzięcia czterech instrukcji, w których jedno będzie ... Jak zawsze, porównaj czytelność z wydajnością w rzeczywistym przypadku użycia.

Jon Skeet
źródło
25
Skeet to bestia!
mięso
2
dobrze opracowane, naprawdę doceniam!
Gaurav Aroraa
11

Zdaję sobie sprawę, że to pytanie jest dość stare, ale miałem podobny problem, tyle że mój ciąg zawierał spacje. Dla tych, którzy chcą wiedzieć, jak oddzielić ciąg nie tylko przecinkami:

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

StringSplitOptions usuwa rekordy, które byłyby tylko znakiem spacji ...

Des Horsley
źródło
To nie zadziała, jeśli zamiast tego miałbyś „Tom Cruise”
płonący
4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Ten działa.

Rune Grimstad
źródło
2

Spróbuj tego:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Yona
źródło
Pojawia
1

Brakuje tutaj tego, że .Reverse () jest metodą void. Nie można przypisać wyniku .Reverse () do zmiennej. Możesz jednak zmienić kolejność, aby użyć Enumerable.Reverse () i uzyskać wynik

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

Różnica polega na tym, że Enumerable.Reverse () zwraca IEnumerable <T> zamiast void return

JaredPar
źródło
1

Jeśli próbujesz

  1. Użyj wielu separatorów
  2. Filtruj puste ciągi
  3. Przytnij wiodące / końcowe spacje

następujące powinny działać:

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

Wynik

  • Tomek
  • Rejs
  • Scott
  • Pion
  • w

Teraz możesz oczywiście odwrócić kolejność, jak sugerowali inni.

w ogniu
źródło