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?

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.


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 ...


To nie zadziała, jeśli zamiast tego miałbyś „Tom Cruise”
płonący


2

Spróbuj tego:

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


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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.