2013-02-23 33 views
18

Tôi cũng gặp phải nhiều tình huống khi có IEnumerable là không đủ. Tuy nhiên tôi không chắc chắn về hiệu suất của các cuộc gọi phương thức trên.LINQ ToList/ToArray/Hiệu suất ToDictionary

Những gì tôi thực sự muốn hỏi là:

là hiệu suất của ToList/ToArray:

  1. một O (n) hoạt động mà các bản sao các IEnumerable đến một mảng mới/Danh mục sách?
  2. Nếu tôi gọi phương thức mở rộng LINQ trên danh sách, nó có hiệu suất O (1) nếu tôi gọi ToList nhưng O (n) nếu gọi ToArray (và ngược lại nếu danh sách gốc của tôi là một mảng)?

  3. Một số phép thuật xảy ra và hiệu suất là O (1)?

Có thể là từ điển là O (n), phải không?

Trả lời

43

Hiệu suất của ToList/ToArray hoạt động O (n) sao chép IEnumerable vào mảng/danh sách mới?

Có. ToList có hiệu quả hơn một chút vì không cần phải cắt bộ đệm bên trong theo chiều dài phù hợp trước.

Nếu tôi gọi phương thức mở rộng LINQ trên danh sách, nó có hiệu suất O (1) nếu tôi gọi ToList nhưng O (n) nếu gọi ToArray (và ngược lại nếu danh sách gốc của tôi là mảng)?

Không. Đối với cả hai cuộc gọi, bộ sưu tập mới luôn được tạo; đó là một bản sao nông của bộ sưu tập gốc. Sẽ hiệu quả hơn khi gọi ToList hoặc ToArray trên bất kỳ ICollection<T> nào hơn trên IEnumerable<T> đơn giản mà không triển khai ICollection<T> mặc dù, như với một bộ sưu tập có thời lượng bắt đầu. (Điều này được phát hiện tại thời điểm thực thi, bạn không cần phải lo lắng về loại thời gian biên dịch.)

Có thể là từ điển là O (n), phải không?

Giả sử băm là hợp lý, đó là O (N), có. Về cơ bản nó tạo ra một từ điển mới trong chính xác cách bạn có thể mong đợi nó.

Bạn có thể muốn đọc bài viết tương ứng trong blog của loạt tôi Edulinq:

+0

Tôi cũng sẽ thêm liên kết đến câu trả lời của bạn: http: //msmvps.com/blogs/jon_skeet/archive/2011/01/01/reimplementing-linq-to-objects-part-20-tolist.aspx – MarcinJuraszek

+0

@JonSkeet: wow, tôi không nhận thấy đó là blog của bạn đăng bài ở đó :) Có thể nói, thực sự tốt đẹp nhất! – MarcinJuraszek

+0

@MarcinJuraszek Vâng, hãy xem toàn bộ [chuỗi Edulinq] (http: // msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx) và sách điện tử. Công cụ tuyệt vời và thực sự giúp hiểu LINQ, lặp lại bộ sưu tập và chỉ một số sự thanh lịch của nó nói chung; thực sự mở rộng suy nghĩ của tôi. Phát biểu của ebook, bất kỳ kế hoạch Jon trên lấy một pass thứ hai cập nhật/chỉnh sửa các phiên bản PDF được xuất bản? Tôi hoàn toàn sẽ mua một phiên bản hoàn toàn được đánh bóng và in ấn của nó. :) –

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