2009-01-26 7 views
54

Existe-t-il un moyen de convertir un List(of Object) en List(of String) dans C# ou vb.net sans parcourir tous les éléments? (Dans les coulisses itération est bien - je veux juste un code concis)Convertir la liste (de l'objet) en Liste (de la chaîne)

Mise à jour: La meilleure façon est probablement juste pour faire une nouvelle sélection

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

ou

myList.Select(i => i.ToString()); 

Répondre

60

Non possible sans itération pour créer une nouvelle liste. Vous pouvez envelopper la liste dans un conteneur qui implémente IList.

Vous pouvez utiliser LINQ pour obtenir une version évaluée paresseuse de IEnumerable<string> à partir d'une liste d'objets comme celui-ci:

var stringList = myList.OfType<string>(); 
+13

Au lieu de OfType (qui filtre la liste) utiliser Select (i => i.ToString()) –

+1

@geoff: Cela dépend de ce que vous cherchez. Si un élément est nul, i.ToString échouera. Vous pourriez également envisager de Cast (); –

+0

@MehrdadAfshari: Indépendamment du traitement nul, OfType() filtrera les éléments qui ne sont pas des chaînes - il ne tentera pas de lancer ou d'appeler ToString(), ils seront simplement filtrés. Ce n'est pas ce qui a été demandé. –

3

Non - si vous voulez convertir TOUS éléments d'une liste, vous devrez touchez TOUS les éléments de cette liste d'une manière ou d'une autre.

Vous pouvez spécifier/écrire l'itération de différentes manières (foreach() ...... ou .ConvertAll() ou autre), mais à la fin, d'une manière ou d'une autre, du code va se répéter sur chaque élément et le convertir.

Marc

20

Si vous voulez plus de contrôle sur la façon dont la conversion a lieu, vous pouvez utiliser ConvertAll:

var stringList = myList.ConvertAll(obj => obj.SomeToStringMethod()); 
+0

Oui c'est le cas, mais c'est dans les coulisses. – kenny

8

Vous voulez dire quelque chose comme ça?

List<object> objects = new List<object>(); 
var strings = (from o in objects 
       select o.ToString()).ToList(); 
+0

Faites simplement ceci: Liste chaînes = (à partir de o dans les objets, sélectionnez o.ToString()). ToList(); –

+1

J'ai mis à jour pour ajouter l'appel ToList (assez évident). – ctacke

+1

J'avais besoin de convertir une liste d'objets utilisateur (app) en Liste pour un cas d'utilisation de migration d'environnement. Une adaptation mineure de cette approche a bien fonctionné pour moi.'var userIDsSource = (à partir de r dans MigrationSession.UsersSource, sélectionnez r.UserID) .ToList();' – Developer63

1

Pouvez-vous effectuer la conversion de chaîne pendant la construction de la liste (de l'objet)? Ce serait le seul moyen d'éviter d'énumérer toute la liste après la création de la liste (d'objet).

22

Cela fonctionne pour tous les types.

List<object> objects = new List<object>(); 
List<string> strings = objects.Select(s => (string)s).ToList(); 
Questions connexes