2010-11-16 22 views
5

kullanarak IEnumable için IEnumable dönüştürün. Sorun, aşağıdaki kod, select ifadesinde bir argüman boş istisnası atar. Neyi yanlış yapıyorum? Ben IEnumerable < döndürülen dize > yinelemenize çalıştıklarında linq: Ben bir IEnumerable <dizeye> dönüştürmek istediğiniz bir IEnumerable < çift > sahip yardımcı yöntemi

gerçek sorun

oluşur. InvalidCastException alıyorum. Ben dizeleri = {System.Linq.Enumerable.WhereSelectEnumerableIterator < çift, dize >}

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

Tamam, benim sorun çözüldü debuger görüyoruz. Bu Linq gecikmeli yürütme, hata ayıklamayı zorlaştırır. Ben aslında sorun neden yukarı doğru bir çağrı var.

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

kodu olarak-herhangi ArgumentNullException atmak gerekir. 'd 'boş olamaz, çünkü bu bir değer türüdür; ve 'çiftler' boş olamaz, çünkü bunu kontrol edersiniz. Sorunu gösteren kısa ama eksiksiz bir program ekleyebilir misiniz? – dtb

cevap

6

Ben kodunuzu denedim ve bir hata alamadım:

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

Veya iş mantığını karşılamak gereken bazı gerçek eğlence için

.

Bu, bir sıfır IEnumerable<double> yöntemini yönteminize geçirdiğinizi gösterir.

P. Bu şekilde yöntemini kısaltabilirsiniz:

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

Doğru söylüyorsun Matt. Yukarıdaki kod örneği çalışmalıdır. Asıl istisna, kodumdaki akıştan kaynaklanıyor ve IEnumarable üzerinden geçene kadar atmıyor – Osiris

1

Neden sadece:

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

İş mantığı aslında daha karmaşık, ben sadece soru için basit bıraktım. – Osiris

+0

@Osiris Yanıtım güncellendi –

0

Sadece dönüşüme bu şekilde yapabilirsiniz:

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