2010-11-16 15 views
5

mam IEnumerable < podwójne > chcę przekonwertować do IEnumerable < ciąg >. Problem polega na tym, że poniższy kod zgłasza wyjątek null dla instrukcji select. Co robię źle?LINQ: Konwersja IEnumable <double> do IEnumable <string> użyciu metody pomocnika

Rzeczywisty problem pojawia się przy próbie iterację zwróconego IEnumerable < ciąg >. Otrzymuję wyjątek InvalidCastException . Widzę w debuger że struny = {System.Linq.Enumerable.WhereSelectEnumerableIterator < double, 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); 
    } 

Ok, I rozwiązać mój problem. Ta opóźniona realizacja Linq sprawia, że ​​debugowanie jest trudne. Mam problem z połączeniem w górę strumienia.

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

Kod jak jest nie powinny rzucać żadnych ArgumentNullException. 'd' nie może mieć wartości null, ponieważ jest to typ wartości; i 'double' nie może być wartością null, ponieważ to sprawdzasz. Czy możesz dodać krótki, ale kompletny program, który pokazuje problem? – dtb

Odpowiedz

6

Próbowałem swój kod i nie pojawia się błąd.

Oznacza to, że w swojej metodzie podajesz wartość zerową IEnumerable<double>.

P.s. można skrócić swoją metodę do tego:

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

Matt masz rację. Powyższy przykład kodu powinien działać. Rzeczywisty wyjątek jest powodowany przez mój kod w strumieniu i nie rzuca, dopóki nie przejdę przez IEnumarable Osiris

1

Dlaczego nie po prostu:

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

Albo jakiegoś realnego zabawy, które powinny pomieścić swoją logikę biznesową:

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

Logika biznesowa jest w rzeczywistości bardziej skomplikowana, po prostu zostawiłem to proste na pytanie. – Osiris

+0

@Osiris zaktualizowałem swoją odpowiedź –

0

Można po prostu zrobić konwersję w ten sposób:

ver strings = doubles.Select(d => string.Format("{0:0.00}", d)); 
Powiązane problemy