2010-11-16 4 views
5

Ich habe eine IEnumerable <Doppel> ich > in ein IEnumerable < Zeichenfolge konvertieren möchten. Das Problem ist der folgende Code löst eine Argument-Null-Ausnahme für die Select-Anweisung aus. Was mache ich falsch?Linq: Konvertieren IEnumable <double> zu IEnumable <string> mit Hilfsmethode

Das eigentliche Problem tritt auf, wenn ich versuchen > durch die zurück IEnumerable < String iterieren. Ich bekomme eine InvalidCastException. Ich sehe in der debuger, die Strings = {System.Linq.Enumerable.WhereSelectEnumerableIterator < Doppel, string >}

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

Okay, ich mein Problem gelöst. Diese verzögerte Ausführung von Linq macht das Debugging schwierig. Ich habe tatsächlich einen Anruf stromaufwärts, der das Problem verursacht.

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

Der Code als Service-Leistung sollte kein Argument werfen. 'd' kann nicht null sein, weil es ein Werttyp ist; und 'doubles' kann nicht null sein, weil Sie nach dem suchen. Können Sie ein kurzes, aber vollständiges Programm hinzufügen, das das Problem aufzeigt? – dtb

Antwort

6

Ich habe Ihren Code versucht, und ich habe nicht einen Fehler.

Das bedeutet, dass Sie eine Null IEnumerable<double> in Ihre Methode übergeben.

Ps.s. Sie können Ihre Methode diese verkürzen:

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

Matt Sie sind richtig. Das obige Codebeispiel sollte funktionieren. Die tatsächliche Ausnahme wird in meinem Code stromaufwärts verursacht und wird nicht ausgelöst, bis ich IEnumarable durchlaufen habe – Osiris

1

Warum nicht einfach:

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

Oder für einigen echten Spaß, dass Ihre Geschäftslogik empfangen soll:

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

Die Geschäftslogik ist eigentlich komplizierter, ich habe es einfach für die Frage gelassen. – Osiris

+0

@Osiris I aktualisiert meine Antwort –

0

Sie können die Konvertierung auf diese Weise einfach tun:

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