2010-11-16 13 views
5

Ho un IEnumerable <doppia> voglio convertire a un < stringa IEnumerable >. Il problema è il seguente codice genera un'eccezione null di argomento sull'istruzione select. Cosa sto sbagliando?LINQ: Convertire IEnumable <double> a IEnumable <string> utilizzando metodo di supporto

Il vero problema si verifica quando provo per scorrere l'tornato IEnumerable <stringa>. Ricevo un'invalidCastException . Vedo nel debuger che le stringhe = { System.Linq.Enumerable.WhereSelectEnumerableIterator < doppio, stringa >}

private IEnumerable<string> ConvertToString(IEnumerable<double> doubles) 
    { 
    IEnumerable<string> strings = null; 

    if (doubles != null) 
     strings = doubles.Select(d => ConvertToString(d)); 

    return strings; 
    } 


    private string ConvertToString(double d) 
    { 
    return string.Format("{0:0.00}", d); 
    } 

Va bene, ho risolto il mio problema. Questa esecuzione ritardata di Linq rende difficile il debug. In realtà ho una chiamata a monte che causa il problema.

ICollection<float> floats; //pretend it holds valid data 
ConvertToString(floats.Cast<double>()) //<---This is naughty 
+4

Il codice così com'è, non dovrebbe gettare alcun ArgumentNullException. 'd' non può essere nullo, perché è un tipo di valore; e 'doubles' non può essere nullo, perché lo controlli. Puoi aggiungere un programma breve ma completo che mostri il problema? – dtb

risposta

6

Ho provato il codice e non un errore.

Ciò significa che si sta passando un valore IEnumerable<double> nullo nel metodo.

P.s È possibile ridurre il metodo a questo:

private IEnumerable<string> ConvertToString(IEnumerable<double> doubles) 
{ 
    return doubles.Select(ConvertToString); 
} 
+0

Matt, hai ragione. L'esempio di codice sopra dovrebbe funzionare. L'effettiva eccezione è causata dal flusso di codice nel mio codice e non viene generata finché non eseguo il ciclo di IEnumarable Osiris

1

Perché non basta:

doubles.Select(d => d.ToString("0.00")); 

O per qualche vero divertimento che dovrebbe ospitare la logica di business:

private IEnumerable<string> ConvertToString(IEnumerable<double> doubles, Func<string, double> convertToString) 
{ 
    return doubles.Select(d => convertToString(d)) 
} 

ConvertToString(doubles, d => d.ToString("0.00")); 
+0

La logica aziendale è in realtà più complicata, ho appena lasciato la domanda semplice. – Osiris

+0

@Osiris Ho aggiornato la mia risposta –

0

si può semplicemente fare la conversione in questo modo:

ver strings = doubles.Select(d => string.Format("{0:0.00}", d)); 
Problemi correlati