Jaka jest poprawna składnia tego:
IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();
Co ja psuję? Co oznacza TSource?
Odpowiedzi:
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.
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 ...
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();
Ten działa.
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
Jeśli próbujesz
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
Teraz możesz oczywiście odwrócić kolejność, jak sugerowali inni.