2011-09-27 31 views
5

devo un'entità chiamata prodottoConvertire IEnumerable <T> a string []

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

e ho un elenco di tutti i prodotti:

IEnumerable<Product> products = _productRepository.GetAll() 

voglio ottenere un array di stringhe da questa lista dei prodotti questo array conterrà l'Id + Product Name del prodotto, quindi quando provo a lanciarlo utilizzando il seguente codice:

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

ho ottenuto la seguente eccezione:

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

l'eccezione che rende davvero un sacco fo scence, quindi se ho avuto un metodo

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

o un override di ToString() per l'oggetto prodotto così come posso utilizzare questo metodo per ottenere l'elenco di string [] da IEnumerable?

risposta

20

Beh, visto che il metodo è possibile utilizzare :

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

Tuttavia, sarebbe più idiomatico per fai questo senza un metodo separato, di solito, usando un'espressione lambda:

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

Userei solo un metodo separato se sarebbe stato chiamato da vari punti (garantendo coerenza) o fatto molto lavoro.

EDIT: Ho appena notato che il vostro descrizione (volendo ID + nome) non corrispondono in realtà il metodo ProductToString che hai dato (che dà solo il nome). Per il nome ID + userei:

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

Oppure si può semplicemente cambiare il metodo ProductToString, naturalmente.

In alternativa, si potrebbe ignorare ToString() in Product, se questo è di solito come si desidera convertire un Product ad un string. È quindi possibile utilizzare una conversione del gruppo metodo o un'espressione lambda per chiamare ToString.


E 'possibile che non è necessario specificare l'argomento di tipo esplicitamente - che:

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

funzionerà bene - le regole per il tipo di inferenza e di gruppo metodo conversioni sempre mi confondono e il comportamento del compilatore è cambiato leggermente nel tempo. Un semplice test ora sembra che sia funzionante, ma potrebbero esserci delle sottigliezze in leggermente diverse.

+0

IMHO non si dispone di annotare il '' in là e, naturalmente, si mi ha battuto per 30secs .... – Carsten

+0

@ CarstenKönig: E * può * dipendere da quale versione del compilatore che stai utilizzando. Ci sono stati cambiamenti sottili nel compilatore v4, IIRC. Stavo aggiungendo una nota a riguardo nel periodo in cui stavi commentando :) –

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

Oppure, se avete bisogno di Id + Nome:

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(); 
Problemi correlati