2010-11-16 24 views
5

Tôi có một IEnumerable < đôi > Tôi muốn chuyển đổi sang một IEnumerable < chuỗi >. Vấn đề là mã dưới đây ném một ngoại lệ null đối số vào câu lệnh chọn. Tôi đang làm gì sai?LINQ: Chuyển đổi IEnumable <double> để IEnumable <string> sử dụng phương pháp helper

Vấn đề thực tế xảy ra khi tôi cố gắng để lặp qua các trở IEnumerable < chuỗi >. Tôi nhận được InvalidCastException. Tôi nhìn thấy trong debuger rằng chuỗi = {System.Linq.Enumerable.WhereSelectEnumerableIterator < đôi, chuỗi >}

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

Được rồi, tôi giải quyết vấn đề của tôi. Điều này thực thi chậm trễ LINQ làm cho gỡ lỗi khôn lanh. Tôi thực sự có một cuộc gọi ngược dòng gây ra vấn đề.

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

Mã này như-là không nên ném bất kỳ ArgumentNullException. 'd' không thể là null, vì nó là một kiểu giá trị; và 'double' không thể rỗng, bởi vì bạn kiểm tra điều đó. Bạn có thể thêm một chương trình ngắn nhưng đầy đủ để chứng minh sự cố không? – dtb

Trả lời

6

Tôi đã thử code của bạn và tôi không nhận được một lỗi.

Điều đó ngụ ý rằng bạn đang chuyển một số không IEnumerable<double> vào phương thức của mình.

P.s. Bạn có thể rút ngắn thời phương pháp của bạn như thế này:

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

Matt bạn là chính xác. Ví dụ mã ở trên sẽ hoạt động. Ngoại lệ thực sự là gây ra luồng trong mã của tôi và không ném cho đến khi tôi lặp lại qua IEnumarable Osiris

1

Tại sao không chỉ:

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

Hoặc đối với một số niềm vui thực sự mà nên chứa logic kinh doanh của bạn:

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

Logic kinh doanh thực sự phức tạp hơn, tôi chỉ để nó đơn giản cho câu hỏi. – Osiris

+0

@Osiris Tôi đã cập nhật câu trả lời của mình –

0

Bạn chỉ có thể thực hiện việc chuyển đổi theo cách này:

ver strings = doubles.Select(d => string.Format("{0:0.00}", d)); 
Các vấn đề liên quan