2009-05-15 87 views
14

ok Me doy por vencido, ¿cómo se hace esto en una línea?Cómo convertir el objeto [] a la lista <string> en una línea 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

Técnicamente es C# 3.0, que se puede utilizar para atacar .NET frameworks 2.0, 3.0 o 3.5 en VS2008. Confuso, lo sé :) – Lucas

+0

correcto, gracias –

Respuesta

45

¿Está utilizando C# 3.0 con LINQ? Es bastante fácil, entonces:

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

No veo en ninguna parte que la matriz de objetos sea en realidad una matriz de cadenas. Esta respuesta es correcta porque, es decir, duplica * exactamente * lo que el OP publicó en una sola línea. –

+1

@Andrew: Sí, buen punto. Claramente leo la pregunta demasiado rápido. Advertencia mencionada en mi publicación ahora. – Noldorin

+0

como asumiste correctamente del contexto, los objetos vienen de XAML y teóricamente podrían ser de cualquier tipo, así que con esta respuesta cuando envío un entero, se convierte correctamente a una cadena, perfecto –

16

Si tiene LINQ disponible (en .NET 3.5) y C# 3.0 (para los métodos de extensión), entonces no es bastante un buen chiste:

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

No vas conseguir cualquier cosa mucho más corto que lo que has publicado para .NET 2.0/C# 2.0.

Advertencia: Me acabo de dar cuenta de que su object[] no es necesariamente del tipo string. Si ese es, de hecho, el caso, vaya con el método de Matt Hamilton, que hace bien el trabajo. Si el elemento de su matriz es de hecho del tipo string, entonces mi método, por supuesto, funcionará.

+2

gran respuesta - mucho más simple que un linq seleccionar. –

+0

Tenga en cuenta que esto fallará si algún valor no es una cadena. –

+0

@mausch: Sí, acababa de editar la respuesta para agregar la advertencia. – Noldorin

2

Aunque no es un chiste con respecto a la lista <> declaración, le da mismo efecto sin necesidad de LINQ.

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

Una de las variantes más que podrían ser correctas:

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

Esto filtrar los objetos de la lista original que no son string objetos, en lugar de cualquiera de lanzar una excepción o tratando de convertir a todos en cuerdas.

+0

.OfType es muy interesante, lo recordaré, pero en este contexto, necesito mostrar los tres valores sean lo que sean (cadena, entero, 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()) 

Esto convierte una matriz de object tipo de matriz de string. Puede convertir a otra matriz de tipos cambiando la expresión lambda.

Cuestiones relacionadas