Tôi thường viết mã như sau: if (list.Count > 0) { }
Điều này có hiệu quả không?
Có. Điều đó lấy số đếm trong danh sách, được lưu trữ trong một trường bên trong danh sách và so sánh nó với số không.
Bây giờ một câu hỏi mà bạn không đặt câu hỏi:
gì về if (sequence.Count() > 0) { }
? (Chú ý dấu ngoặc trên Count()
.)
Chúng tôi thẩm vấn trình tự thời gian chạy để xem nếu nó là một danh sách đó có một tài sản có thể được tính toán một cách hiệu quả Count
. Nếu có, chúng tôi gọi nó. Nếu không, chúng tôi tính toàn bộ chuỗi một mục tại một thời điểm, và sau đó so sánh nó với số không.
Điều đó cực kỳ không hiệu quả?
Có.
Điều gì sẽ hiệu quả hơn?
if (sequence.Any())
Tại sao là hiệu quả hơn?
Vì nó cố gắng lặp qua thành phần một. Nếu thành công, thì Any
là đúng; nếu không thành công thì Any
là sai. Bạn không cần đếm số lượng thạch trong bình để biết liệu có nhiều hơn 0 không. Bạn chỉ cần xem xét xem có ít nhất một người không.
Ngoài việc được hiệu quả hơn đáng kể, mã giờ đây giống như ý nghĩa của mã. Nếu bạn có ý định hỏi "có bất kỳ mục nào trong danh sách không?" sau đó hỏi "có bất kỳ mục nào trong danh sách không?" và không phải "số lượng các mục trong danh sách lớn hơn không?"
Thuộc tính Capacity
của danh sách là gì?
Điều đó cho bạn biết số lượng không gian đã được phân bổ trước trong cấu trúc dữ liệu nội bộ của danh sách. Đó là số lượng các mục mà danh sách có thể lưu trữ trước khi nó phải cấp phát bộ nhớ nhiều hơn.
Nguồn
2012-04-13 14:44:30
"Chúng tôi thẩm vấn trình tự trong thời gian chạy để xem nếu nó là một danh sách có một tính Count có thể được tính hiệu quả." Ý bạn là như thế nào? Bạn có kiểm tra một thuộc tính được gọi là 'Đếm' hay bạn kiểm tra xem 'ICollection' có được triển khai không? Trường hợp thứ hai có các trường hợp đặc biệt buồn cười nếu bạn sử dụng hiệp phương sai của 'IEnumerable '. –
CodesInChaos
@CodeInChaos: Nhìn qua Phản chiếu cho thuộc tính có tên Đếm sẽ chậm và không đáng tin cậy. Chúng tôi tìm kiếm một giao diện thực hiện. Và có, bạn có thể nhận được âm tính giả là kết quả của các vấn đề hiệp phương sai. Nếu nó đau khi bạn làm điều đó thì đừng làm thế. –
@CodeInChaos nếu kiểm tra 'ICollection 'không thành công, thì mã sẽ kiểm tra' ICollection' không chung chung. Vì vậy, hầu hết các bộ sưu tập khung được an toàn từ vấn đề hiệp phương sai. –
phoog