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?

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.


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


Dies wird nicht funktionieren, wenn Sie "Tom Cruise" statt nur Tom
Flammen

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

Dieser funktioniert.


1

Versuche dies:

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

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.