Liste (des Objekts) in Liste (der Zeichenfolge) konvertieren

74

Gibt es eine Möglichkeit, a in c # oder vb.net List(of Object)in a List(of String)umzuwandeln, ohne alle Elemente zu durchlaufen? (Hinter den Kulissen ist die Iteration in Ordnung - ich möchte nur prägnanten Code)

Update: Der beste Weg ist wahrscheinlich nur eine neue Auswahl

myList.Select(function(i) i.ToString()).ToList();

oder

myList.Select(i => i.ToString()).ToList();
Geoff Appleford
quelle

Antworten:

80

Nicht möglich ohne Iteration, um eine neue Liste zu erstellen. Sie können die Liste in einen Container einschließen, der IList implementiert.

Sie können LINQ verwenden, um eine träge ausgewertete Version von IEnumerable<string>aus einer Objektliste wie der folgenden abzurufen:

var stringList = myList.OfType<string>();
Mehrdad Afshari
quelle
21
Anstelle von OfType (das die Liste filtert) verwenden Sie Select (i => i.ToString ())
Geoff Appleford
1
@geoff: Kommt darauf an, wonach du suchst. Wenn ein Element null ist, schlägt i.ToString fehl. Sie könnten auch Cast <string> () in Betracht ziehen;
Mehrdad Afshari
2
@MehrdadAfshari: Unabhängig von der Nullbehandlung filtert OfType () Elemente heraus, die keine Zeichenfolgen sind. Es wird nicht versucht, ToString () umzuwandeln oder aufzurufen, sondern sie werden nur herausgefiltert. Das wurde nicht verlangt.
Daniel Schaffer
1
@ DanielSchaffer Ich habe die Frage wie folgt gelesen: Sie haben eine List<object>, die stringnur Objekte enthält , und Sie möchten List<string>stattdessen eine dieser Objekte erhalten. Die Frage ist unklar, was die Eingabe ist; in Abhängigkeit von der Eingangsspezifikation und Ihrem Ziel, können Sie auswählen möchten OfType<string>, Cast<string>()oder Select(...).
Mehrdad Afshari
48

Dies funktioniert für alle Typen.

List<object> objects = new List<object>();
List<string> strings = objects.Select(s => (string)s).ToList();
Christer Eriksson
quelle
24

Wenn Sie mehr Kontrolle darüber haben möchten, wie die Konvertierung erfolgt, können Sie ConvertAll verwenden:

var stringList = myList.ConvertAll(obj => obj.SomeToStringMethod());
Daniel Schaffer
quelle
Ja, aber es ist hinter den Kulissen.
Kenny
11

Du meinst so etwas?

List<object> objects = new List<object>();
var strings = (from o in objects
              select o.ToString()).ToList();
ctacke
quelle
1
Gehen Sie dazu folgendermaßen vor: List <string> strings = (von o in Objekten wählen Sie o.ToString ()). ToList ();
steve_c
1
Ich musste eine Liste von (App-) Benutzerobjekten für einen Anwendungsfall für die Umgebungsmigration in eine Liste <Zeichenfolge> konvertieren. Eine geringfügige Anpassung dieses Ansatzes hat für mich sehr gut funktioniert. var userIDsSource = (from r in MigrationSession.UsersSource select r.UserID).ToList();
Developer63
3

Nein - Wenn Sie ALLE Elemente einer Liste konvertieren möchten , müssen Sie ALLE Elemente dieser Liste auf die eine oder andere Weise berühren .

Sie können die Iteration auf verschiedene Arten angeben / schreiben (foreach () ...... oder .ConvertAll () oder was auch immer), aber am Ende wird auf die eine oder andere Weise ein Code über jeden einzelnen iterieren Element und konvertieren Sie es.

Marc

marc_s
quelle
1

Können Sie die Zeichenfolgenkonvertierung durchführen, während die Liste (des Objekts) erstellt wird? Nur so kann vermieden werden, dass die gesamte Liste nach dem Erstellen der Liste (des Objekts) aufgelistet wird.

Ben Robbins
quelle