2010-01-18 17 views
8

Làm cách nào để kiểm tra đối tượng từ điển chung để xem liệu nó có trống không? Tôi muốn chạy một số mã như sau:Làm cách nào để kiểm tra bộ sưu tập generic.dictionary trống?

while (reportGraphs.MoveNext()) 
{ 
    reportGraph = (ReportGraph)reportGraphs.Current.Value; 
    report.ContainsGraphs = true; 
    break; 
} 

Đối tượng reportGraph là loại System.Collections.Generic.Dictionary Khi chạy đoạn mã này sau đó điển reportGraphs trống và MoveNext() ngay lập tức ném một NullReferenceException. Tôi không muốn đặt một thử-catch xung quanh khối nếu có một cách performant hơn xử lý các bộ sưu tập sản phẩm nào.

Cảm ơn.

+2

Bạn có chắc 'reportGraphs' không phải là' null' không? – dtb

+2

'System.Collections.Generic.Dictionary' không * có * phương thức' MoveNext() '. Bạn có chắc bạn không nghĩ đến một trình lặp trên một từ điển? –

+0

Rất tiếc, báo cáo thực sự được định nghĩa là .Enumerator, như trong reportGraphs = new System.Collections.Generic.Dictionary .Enumerator(); Vì vậy, bất kỳ cách nào để phát hiện MoveNext() sẽ ném một ngoại lệ khi áp dụng cho Điều tra viên. Nếu tôi thử kiểm tra null, tôi nhận được Toán tử '! =' Không thể áp dụng cho các toán hạng kiểu 'System.Collections.Generic.Dictionary .Enumerator' và '' – DEH

Trả lời

12

Nếu đó là từ điển chung, bạn chỉ có thể kiểm tra Dictionary.Count. Đếm sẽ là 0 nếu nó trống.

Tuy nhiên, trong trường hợp của bạn, reportGraphs có vẻ như đó là số IEnumerator<T> - có lý do nào liệt kê bộ sưu tập của bạn bằng tay không?

+0

Bạn là đúng - nó thực sự là một điều tra viên - xin lỗi. Không có lý do mạnh mẽ, nó chỉ là cách mô hình đối tượng trong ứng dụng đã được cấu trúc - thay đổi nó sẽ yêu cầu khá nhiều công việc ... – DEH

+1

Nó thường là một cách tiếp cận tốt hơn để không làm việc với IEnumerator trực tiếp - sử dụng một vòng lặp foreach thay thế , vì nó thường sẽ ngăn chặn kịch bản chính xác này ... –

6

Có sự khác biệt giữa từ điển emptynull. Gọi số MoveNext trên bộ sưu tập trống sẽ không dẫn đến số NullReferenceException. Tôi đoán trong trường hợp của bạn, bạn có thể kiểm tra nếu reportGraphs != null.

+0

reportGraphs trông giống như một điều tra viên hơn là một từ điển. Tại sao một từ điển nên trả về một bảng liệt kê 'null'? Chỉ cần tự hỏi ... – dtb

+0

@ dtb điểm tốt. Nó phải là một 'IEnumerable '. –

+0

Nhưng 'Dictionary 'thực hiện' IEnumerable > ', phải không? Tôi tin rằng đây là nơi mà thuộc tính 'Value' xuất phát từ đó. – Groo

3

Như Darin đã nói, reportGraphsnull nếu nó ném một số NullReferenceException. Cách tốt nhất là đảm bảo rằng nó không bao giờ rỗng (tức là đảm bảo rằng nó được khởi tạo trong hàm tạo của lớp).

Một cách khác để làm điều này (để tránh liệt kê một cách rõ ràng) sẽ được sử dụng một tuyên bố foreach:

foreach (KeyValuePair<Key,Value> item in reportGraphs) 
{ 
    // do something 
} 

[Chỉnh sửa] Lưu ý rằng ví dụ này cũng giả định rằng reportGraphs là không bao giờ null.

+0

Điều này sẽ ném NullReferenceException nếu reportGraphs là null. –

+0

Chính xác, * cách tốt nhất là đảm bảo rằng nó không bao giờ rỗng *. – Groo

Các vấn đề liên quan