2013-05-18 11 views
5

Theo số MSDN docs for String.Join "Nếu bất kỳ phần tử nào có giá trị là null, thì một chuỗi rỗng sẽ được sử dụng thay thế.".Net C# String.Join làm thế nào để đầu ra "null" thay vì chuỗi rỗng nếu giá trị phần tử là null?

Mã tôi có kéo dữ liệu ra khỏi một DataTable

rotationValues = string.Join<object>(", ", 
    from r in rotationData.Rows.OfType<DataRow>() select r[5]); 

này sẽ cho kết quả đầu ra tương tự như sau:

8, 7, , 12, , , 13, 

Có cách nào để chỉ cần có nó đặt "null" trong vị trí của một chuỗi rỗng như vậy:

8, 7, null, 12, null, null, 13, null 
+0

@NetStarter condition là vấn đề trong trường hợp có nhiều chuỗi khác nhau bị kéo ra khỏi dữ liệu, nếu nó chỉ là rotationValues ​​thì có lẽ sẽ ổn, nhưng có rotationStdDev, rotationMin, rotationMax, yadda yadda yadda, một số 20 giá trị cho mỗi và một điều kiện sẽ tạo ra rất nhiều chi phí. Nhờ đề nghị mặc dù. –

Trả lời

7

Bạn có thể chọn

r[5] ?? "null" 

thay vì chỉ r[5].

Ngoài ra, chỉ cần xóa phần <object> khi bạn gọi phương thức chung. Nó vẫn sẽ là IEnumerable<object> mà bạn tham gia, nhưng trình biên dịch sẽ suy ra tham số kiểu tự động.

BỔ SUNG sau khi bình luận:

bạn r[5] có thể DBNull.Value. Sau đó, đây không phải là tham chiếu null "thực", nhưng thực thi ToString trả về "". Vì vậy, trong trường hợp đó, tài liệu string.Join không hoàn toàn phù hợp. Vì vậy, hãy cố gắng chọn một cái gì đó giống như

(r[5] == null || DBNull.Value.Equals(r[5])) ? "null" : r[5] 

hoặc có thể

(r[5] == null || r[5] is DBNull) ? "null" : r[5] 

Hy vọng nó giúp.

+0

Chính xác những gì tôi cần, cảm ơn bạn rất nhiều và tôi đã học được điều mà tôi không thể tìm thấy trên Google. Rất tuyệt vời! –

+0

Tôi đã nói quá sớm, câu trả lời có vẻ tốt nhưng một khi đã thực hiện nó không thực sự thay thế các giá trị NULL. Đây là cách rotationData xuất hiện về DataSet myDataSet = new DataSet(); mySqlDataAdapter.Fill (myDataSet); DataTable rotationData = myDataSet.Tables ["Bảng"]; –

+0

Cảm ơn một lần nữa Jeppe, tôi cũng đăng một câu hỏi tiếp theo mà kết quả trong folks chỉ ra rằng null không bằng DBNull, xem http://stackoverflow.com/questions/16621962/net-c-sharp-operator-didnt-trigger -cho-system-dbnull-type-in-datatable-dữ liệu –

0

Để mở rộng câu trả lời của Jeppe, tôi không chắc tại sao cách của anh ấy không thực sự hiệu quả với tôi, tôi xác nhận rằng giá trị null trong r[5] thực sự thuộc loại System.DBNull nhưng nó không thay thế bằng "null" .

Dưới đây là những gì tôi đã kết thúc làm thay vì:

rotationValues = string.Join(", ", 
    from r in rotationData.Rows.OfType<DataRow>() 
    select (r[5].ToString().Length == 0 ? "null" : r[5])); 

Đó là một điều kiện mà tôi không muốn làm, nhưng tôi đã có một cái nhìn tại trang này C# Empty Strings nơi chàng làm chuẩn cách khác nhau để kiểm tra cho dù một chuỗi là trống rỗng và phương pháp chiều dài là nhanh nhất. Vì vậy, tôi figured để kiểm tra chiều dài và tham gia "null" nếu chiều dài là 0 và giá trị thực tế r[5] khi nó không phải là số không.

Bạn vẫn nên tìm hiểu lý do tại sao ?? "null" không hoạt động.

CHỈNH SỬA CHO THAM KHẢO: Vấn đề thực sự là ?? hoạt động trên null và không phải DBNull.Xem thêm .Net C# ?? operator didn't trigger for System.DBNull type in DataTable DataRow

+1

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