2009-05-15 14 views
14

ok J'abandonne, comment faites-vous cela en une ligne?Comment faire pour convertir l'objet [] à la liste <string> dans une ligne de C# 3.0?

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    //List<string> fields = values.ToList<string>(); 
    //List<string> fields = values as List<string>; 
    //List<string> fields = (List<string>)values; 

    List<string> fields = new List<string>(); 
    foreach (object value in values) 
    { 
     fields.Add(value.ToString()); 
    } 

    //process the fields here knowning they are strings 
    ... 
} 
+2

Techniquement, c'est C# 3.0, qui peut être utilisé pour cibler les frameworks .NET 2.0, 3.0 ou 3.5 dans VS2008. Confus, je sais :) – Lucas

+0

correct, merci –

Répondre

45

Utilisez-vous C# 3.0 avec LINQ? Il est assez facile alors:

List<string> fields = values.Select(i => i.ToString()).ToList(); 
+4

Je ne vois nulle part que le tableau d'objets était en fait un tableau de chaînes. Cette réponse est correcte car elle duplique * exactement * ce que l'OP a posté dans un one-liner. –

+1

@Andrew: Oui, bon point. Je lis clairement la question trop rapidement. Avertissement mentionné dans mon post maintenant. – Noldorin

+0

comme vous l'avez supposé correctement du contexte, les objets viennent de XAML et théoriquement pourraient être de n'importe quel type, ainsi avec cette réponse quand j'envoie un entier, il est correctement converti en une chaîne, parfaite –

16

Si vous avez LINQ disponible (en .NET 3.5) et C# 3.0 (pour les méthodes d'extension), alors il y a une très belle une doublure:

var list = values.Cast<string>().ToList(); 

Tu ne vas pas faire quoi que ce soit beaucoup plus court que ce que vous avez posté pour .NET 2.0/C# 2.0. Je viens de me rendre compte que votre object[] n'est pas nécessairement de type string. Si c'est effectivement le cas, optez pour la méthode de Matt Hamilton, qui fonctionne bien. Si l'élément de votre tableau est en fait de type string, alors ma méthode fonctionnera bien sûr.

+2

bonne réponse - beaucoup plus simple qu'un linq select. –

+0

Notez que cela échouera si une valeur n'est pas une chaîne. –

+0

@mausch: Oui, je viens d'éditer la réponse pour ajouter la mise en garde. – Noldorin

2

Sans une seule ligne par rapport à la liste <> déclaration, vous donne même effet sans nécessiter Linq.

List<string> list = new List<string>(); 
Array.ForEach(values, value => list.Add(value.ToString())); 
4

Une autre variante pourrait être correcte:

List<string> list = values.OfType<string>().ToList(); 

Cela filtrer tous les objets dans la liste originale qui ne sont pas string objets, au lieu de soit lancer une exception ou d'essayer de les convertir en chaînes.

+0

.OfType est très intéressant, s'en souviendra, mais dans ce contexte, j'ai besoin d'afficher les trois valeurs quelles qu'elles soient (string, integer, etc.) –

9

C# 2.0:

List<string> stringList = new List<string>(Array.ConvertAll<object,string>(values, new Converter<object,string>(Convert.ToString))); 
3
Array.ConvertAll(inputArray, p => p.ToString()) 

Ce convertit un tableau de type object à un tableau de string. Vous pouvez convertir en un autre type de tableau en changeant l'expression lambda.