2011-09-27 16 views
5

tengo una entidad llamada ProductoConvertir IEnumerable <T> a string []

class Product 
{ 
    public Id { get; set; } 
    public Name { get; set; } 
} 

y tengo una lista de todos los productos:

IEnumerable<Product> products = _productRepository.GetAll() 

quiero obtener una matriz de cadenas de esta lista de productos esta matriz contendrá el producto Id + Nombre del producto, por lo tanto, cuando intento lanzarlo usando el siguiente código:

string[] s = products.Cast<string>().ToArray(); 

me dieron la siguiente excepción:

Unable to cast object of type 'Product' to type 'System.String' 

la excepción que realmente hace mucho fo scence, por lo que si tuviera un método

string ProductToString(Product p) 
{ 
    return p.Name; 
} 

o una anulación de ToString() para el objeto del producto así que ¿cómo puedo use este método para obtener la lista de cadenas [] de IEnumerable?

Respuesta

20

Pues bien, dado que el método se puede utilizar :

string[] s = products.Select<string>(ProductToString).ToArray(); 

Sin embargo, sería más idiomática a Haga esto sin un método diferente, por lo general, utilizando una expresión lambda:

// Matches ProductToString, but not your description 
string[] s = products.Select(p => p.Name).ToArray(); 

Solo utilizaría un método diferente si se llamaría desde varios lugares (lo que garantizaría la coherencia) o si haría un montón de trabajo.

EDIT: acabo de notar que su descripción (querer ID + nombre) no representa realmente el método ProductToString le has dado (que solo da el nombre). Para obtener el nombre + ID que haría uso:

string[] s = products.Select(p => p.ID + " " + p.Name).ToArray(); 

o

string[] s = products.Select(p => string.Format("{0} {1}", p.ID, p.Name)) 
        .ToArray(); 

O simplemente puede cambiar su método ProductToString, por supuesto.

Como alternativa, puede anular ToString() en Product, si esto es por lo general cómo se desea convertir un Product a un string. Luego, puede usar una conversión de grupo de métodos o una expresión lambda para llamar al ToString.


Es posible que usted no necesita especificar el argumento de tipo explícita - que:

string[] s = products.Select(ProductToString).ToArray(); 

funcionará bien - las normas de conversión de tipo de inferencia y de grupo método siempre me confunden y el comportamiento del compilador ha cambiado ligeramente con el tiempo. Una prueba rápida ahora parece que funciona, pero podría haber sutilezas en ligeramente situaciones diferentes.

+0

en mi humilde opinión no tiene que anotar el '' allí y por supuesto que me ganó por 30 seg .... – Carsten

+0

@ CarstenKönig: Se puede * * dependerá de la versión del compilador que estás usando Hubo cambios sutiles en el compilador v4, IIRC. Estaba agregando una nota sobre eso en el momento en que comentabas :) –

2
string[] s = products.Select(p => p.Name).ToArray(); 

O, si necesita Id Nombre +:

string[] s = products.Select(p => p.Id + ' ' + p.Name).ToArray(); 
1

uso

string[] s = (from p in products select p.Id.ToString() + " " + p.Name.ToString()).ToArray(); 
Cuestiones relacionadas