2009-05-15 9 views
14

ok mi arrendo, come si fa in una riga?Come convertire oggetto [] in lista <string> in una riga di 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

Tecnicamente è C# 3.0, che può essere utilizzato per il targeting di framework .NET 2.0, 3.0 o 3.5 in VS2008. Confondendo, lo so :) – Lucas

+0

corretto, grazie –

risposta

45

Stai utilizzando C# 3.0 con LINQ? E 'abbastanza facile, allora:

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

Non vedo da nessuna parte che l'array di oggetti fosse in realtà una serie di stringhe. Questa risposta è corretta perché, ad esempio, duplica * esattamente * ciò che l'OP ha pubblicato in una sola riga. –

+1

@Andrew: Sì, buon punto. Ho letto chiaramente la domanda troppo velocemente. Caveat menzionato nel mio post ora. – Noldorin

+0

come si presuppone correttamente dal contesto, gli oggetti provengono da XAML e teoricamente potrebbero essere di qualsiasi tipo, quindi con questa risposta quando invio un numero intero, viene convertito correttamente in una stringa, perfetto –

16

Se si dispone di LINQ a disposizione (in .NET 3.5) e C# 3.0 (per i metodi di estensione), poi c'è piuttosto un bel uno di linea:

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

Tu non stai andando ottenere nulla molto più breve di quello che hai pubblicato per .NET 2.0/C# 2.0.

Avvertenza: Ho appena realizzato che il tuo object[] non è necessariamente di tipo string. Se questo è il caso, vai con il metodo di Matt Hamilton, che fa bene il lavoro. Se l'elemento dell'array è in realtà di tipo string, il mio metodo funzionerà ovviamente.

+2

ottima risposta - molto più semplice di una selezione linq. –

+0

Si noti che questo avrà esito negativo se qualsiasi valore non è una stringa. –

+0

@mausch: Sì, ho appena modificato la risposta per aggiungere l'avvertenza. – Noldorin

2

Pur non essendo un uno di linea rispetto alla Lista <> dichiarazione, ti dà lo stesso effetto senza bisogno di LINQ.

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

Ancora una variante che potrebbe essere corretto:

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

Ciò filtrare qualsiasi oggetto nella lista originale che non sono string oggetti, anziché sia ​​un'eccezione o cercando di convertire tutti in stringhe.

+0

.OfType è molto interessante, lo ricorderà, ma in questo contesto, ho bisogno di visualizzare i tre valori qualunque siano (stringa, numero intero, ecc.) –

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

Questo trasforma una matrice di tipo object alla gamma di string. È possibile convertire in un altro tipo array modificando l'espressione lambda.

Problemi correlati