2010-11-16 11 views
5

tengo un IEnumerable <doble> Quiero convertir a un IEnumerable <cadena>. El problema es que el código siguiente arroja una excepción de argumento nulo en la instrucción select. ¿Qué estoy haciendo mal?LINQ: Convertir IEnumable <double> a IEnumable <string> usando método de ayuda

El problema real ocurre cuando intento para iterar a través de la regresado IEnumerable <cadena>. Obtengo una InvalidCastException. Veo en el debuger que las cadenas = { System.Linq.Enumerable.WhereSelectEnumerableIterator < doble, de cadena >}

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

bien, he resuelto mi problema. Esta ejecución retrasada de Linq dificulta la depuración. De hecho, tengo una llamada corriente arriba que causa el problema.

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

El código como está no deben arrojar ningún ArgumentNullException. 'd' no puede ser nulo, porque es un tipo de valor; y 'dobles 'no puede ser nulo, porque lo compruebas. ¿Puedes agregar un programa breve pero completo que demuestre el problema? – dtb

Respuesta

6

He tratado de su código y no obtendrá un error.

Eso implica que está pasando un IEnumerable<double> nulo en su método.

P.s. Puede acortar su método para esto:

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

Matt, estás en lo cierto. El ejemplo de código anterior debería funcionar. La excepción real se produce en mi código y no se lanza hasta que recorro IEnumarable Osiris

1

¿Por qué no:

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

O para la diversión real que debe acomodar su lógica de negocio:

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 lógica de negocios es en realidad más complicada, simplemente lo dejé simple para la pregunta. – Osiris

+0

@Osiris He actualizado mi respuesta –

0

simplemente Usted puede hacer la conversión de esta manera:

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