C # -Syntax - String durch Komma in Array aufteilen, in generische Liste konvertieren und Reihenfolge umkehren

92

Was ist die richtige Syntax dafür:

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

Was vermassle ich? Was bedeutet TSource?

BuddyJoe
quelle

Antworten:

251

Das Problem ist, dass Sie anrufen, List<T>.Reverse()was zurückkehrt void.

Sie könnten entweder tun:

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

oder:

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

Letzteres ist teurer, da das Umkehren eines beliebigen IEnumerable<T>Objekts das Puffern aller Daten und das anschließende Ausgeben aller Daten umfasst - während List<T>das Umkehren "an Ort und Stelle" erfolgen kann. (Der Unterschied besteht darin, dass die Enumerable.Reverse<T>()Erweiterungsmethode anstelle der List<T>.Reverse()Instanzmethode aufgerufen wird.)

Noch effizienter könnten Sie verwenden:

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

Auf diese Weise wird vermieden, dass Puffer mit einer unangemessenen Größe erstellt werden - auf Kosten von vier Anweisungen, bei denen eine ausgeführt wird ... Wie immer sollten Sie die Lesbarkeit im tatsächlichen Anwendungsfall gegen die Leistung abwägen.

Jon Skeet
quelle
25
Skeet ist ein Biest!
Fleisch
2
gut ausgearbeitet, ich habe es sehr geschätzt!
Gaurav Aroraa
11

Mir ist klar, dass diese Frage ziemlich alt ist, aber ich hatte ein ähnliches Problem, außer dass in meiner Zeichenfolge Leerzeichen enthalten waren. Für diejenigen, die wissen müssen, wie man eine Zeichenfolge mit mehr als nur Kommas trennt:

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

Die StringSplitOptions entfernen die Datensätze, die nur ein Leerzeichen ...

Des Horsley
quelle
Dies wird nicht funktionieren, wenn Sie "Tom Cruise" statt nur Tom
Flammen
4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Dieser funktioniert.

Rune Grimstad
quelle
1

Versuche dies:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Yona
quelle
Ich erhalte die Fehlermeldung - Typ 'void' kann nicht implizit in 'System.Collections.Generic.List <string>
konvertiert werden
1

Was Sie hier vermissen, ist, dass .Reverse () eine ungültige Methode ist. Es ist nicht möglich, das Ergebnis von .Reverse () einer Variablen zuzuweisen. Sie können jedoch die Reihenfolge ändern, um Enumerable.Reverse () zu verwenden und Ihr Ergebnis zu erhalten

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

Der Unterschied besteht darin, dass Enumerable.Reverse () eine IEnumerable <T> zurückgibt, anstatt eine ungültige Rückgabe zu sein

JaredPar
quelle
1

Wenn du es versuchst

  1. Verwenden Sie mehrere Trennzeichen
  2. Filtern Sie alle leeren Zeichenfolgen
  3. Trimmen Sie führende / nachfolgende Leerzeichen

Folgendes sollte funktionieren:

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

Ausgabe

  • Tom
  • Kreuzfahrt
  • Scott
  • Bob
  • beim

Jetzt können Sie natürlich die Reihenfolge umkehren, wie andere vorgeschlagen haben.

in Flammen
quelle