2010-11-16 6 views
5

J'ai un IEnumerable < à double > Je veux convertir en une chaîne <IEnumerable>. Le problème est que le code ci-dessous renvoie une exception null d'argument dans l'instruction select. Qu'est-ce que je fais de mal?LINQ: Convertir IEnumable <double> à IEnumable <string> en utilisant la méthode d'aide

Le problème réel se produit lorsque je tente à itérer le retour IEnumerable < chaîne >. Je reçois un InvalidCastException. Je vois dans le debuger que les chaînes = { System.Linq.Enumerable.WhereSelectEnumerableIterator < double, chaîne >}

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

D'accord, je résolu mon problème. Cette exécution retardée de Linq rend le débogage difficile. J'ai en fait un appel en amont causant le problème.

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

Le code en l'état ne doit pas jeter de ArgumentNullException. 'd' ne peut pas être nul, parce que c'est un type de valeur; et 'doubles 'ne peut pas être nul, parce que vous vérifiez pour cela. Pouvez-vous ajouter un programme court mais complet qui démontre le problème? – dtb

Répondre

6

J'ai essayé votre code et je ne suis pas une erreur.

Cela implique que vous transmettez un IEnumerable<double> nul dans votre méthode.

P.s. Vous pouvez réduire votre méthode à ceci:

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

Matt vous avez raison. L'exemple de code ci-dessus devrait fonctionner. L'exception réelle est provoquée en amont dans mon code, et ne jette pas jusqu'à ce que je boucle à travers le IEnumarable Osiris

1

Pourquoi ne pas simplement:

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

Ou pour un vrai plaisir qui devrait accueillir votre logique métier:

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 logique métier est en réalité plus compliquée, je l'ai juste laissé simple pour la question. – Osiris

+0

@Osiris J'ai mis à jour ma réponse –

0

Vous pouvez simplement faire la conversion de cette façon:

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