2010-06-07 29 views
5

Mã tôi đang viết nhận được một ArrayList từ mã không được quản lý, và ArrayList này sẽ luôn chứa một hoặc nhiều đối tượng kiểu Grid_Heading_Blk. Tôi đã xem xét việc thay đổi ArrayList này thành một Danh sách chung, nhưng tôi không chắc liệu hoạt động chuyển đổi có tốn kém đến mức vô hiệu hóa các lợi ích khi làm việc với danh sách chung chung hay không. Hiện tại, tôi chỉ chạy một hoạt động foreach (Grid_Heading_Blk in myArrayList) để làm việc với các nội dung ArrayList sau khi chuyển ArrayList cho lớp sẽ sử dụng nó.Chuyển đổi ArrayList này thành Danh sách Chung có hiệu quả không?

Tôi có nên chuyển đổi ArrayList thành danh sách được nhập chung không? Và nếu vậy, cách hiệu quả nhất để làm như vậy là gì?

Trả lời

2

Đây là cú đâm theo cách thực hiện để tạo danh sách chung từ một ArrayList.

List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count); 
myList.AddRange(source.OfType<Grid_Heading_Blk>()); 

Bằng cách gọi constructor chấp nhận một int, lưu trữ ủng hộ được phân bổ chỉ một lần.

Như mọi khi, bạn nên đo lường hiệu suất bằng cách sử dụng bất kỳ công cụ nào bạn thường sử dụng.

+1

Cảm ơn, tất cả mọi người. Rất nhiều câu trả lời hay ở đây. Mặc dù hiệu suất/hiệu quả chắc chắn là vấn đề chính, nhưng tôi có thể đã đánh giá thấp khả năng đọc được cung cấp bởi cấu trúc đã nhập. Nếu người khác cuối cùng vẫn duy trì mã của tôi, tôi muốn nó càng rõ ràng càng tốt những gì tôi đang làm. – Greg

1

Hình phạt lớn nhất bạn sử dụng ArrayLists là quyền anh.

Với Generics bạn nhận được:
1. biên dịch thời gian an toàn
2. Generics mở rộng
3. loại bỏ hạn chế này của việc có tất cả mọi thứ trong danh sách chuyển đổi thành loại đối tượng.

Đó là những lợi thế bạn có thể sử dụng chúng. Chúng là lợi thế, nhưng nếu bạn phải nhập lại chung từ ArrayList, nó có thể không đáng làm, đặc biệt nếu bạn chỉ lặp qua danh sách để lấy các đối tượng.

0

"Hiệu quả" không phải là thuộc tính hoặc tài sản. Nó là tương đối, giống như một con chuột lớn có lẽ không lớn hơn một con voi nhỏ.

Tùy thuộc vào việc bạn đang làm gì khác.

Số dặm của bạn có thể thay đổi, nhưng theo kinh nghiệm của tôi, trong khi ArrayList có thể "chậm hơn" List<T>, tôi chưa bao giờ làm nhiều việc khác đến mức đáng chú ý.

Điều đó nói rằng, thật tốt khi có trình biên dịch thực hiện kiểm tra kiểu cho tôi, và thật tuyệt khi không phải bỏ qua mọi thứ.

2

Tôi thường sử dụng danh sách kiểm tra này để đánh giá các câu hỏi như của bạn:

  1. Làm cho nó đúng
  2. Hãy nói rõ
  3. Làm cho nó ngắn gọn
  4. Làm cho nó hiệu quả

List<Grid_Heading_Blk>đến nay có ý định tiết lộ hơn ArrayList. Vì vậy, thậm chí không xem xét hiệu quả, đã có một chiến thắng lớn cho mục 2.

Để chuyển đổi ArrayList thành List<>, bạn phải lặp lại ArrayList một lần và bỏ từng phần tử. Các foreach đang làm một diễn viên tiềm ẩn, do đó, chi phí chỉ trong vòng lặp thêm.

Lặp lại chuỗi hai lần lấy hiệu suất từ ​​O(n) đến O(2n), vẫn là O(n) (cường độ, không giá trị, là điều quan trọng đối với hiệu suất). Vì vậy, bạn có thể xem xét sự thay đổi lành tính.

Tuy nhiên, nếu theo nghĩa đen tất cả bạn đang làm là chạy foreach, bạn nên chỉ cần sử dụng ArrayList trực tiếp - thay đổi nó để List<> mua bạn quyền lực không có biểu cảm hơn.

0

Nếu các đối tượng đến từ mã không được quản lý và bạn không cần thêm hoặc xóa đối tượng, thì một mảng Grid_Heading_Blk có thể hiệu quả hơn Danh sách. Nếu bạn có thể lấy đi bằng cách sử dụng một mảng, sử dụng vòng lặp for có thể nhanh hơn một chút so với foreach.

2

Tại sao bạn cần chuyển đổi tất cả ArrayList? Thành thật mà nói, vòng lặp foreach của bạn có vẻ như nó sẽ làm điều đó. Có, như Kevin nói trên hình phạt duy nhất bạn muốn được trả tiền là unboxing - nhưng vì nó đứng nó là mã khá đơn giản và bạn có thể không có đủ tiêu đề lưới để trả một hit hiệu suất thực sự. Nhưng nếu bạn phải chuyển đổi nó, tôi sẽ nói, thay vì viết của riêng bạn cho vòng lặp để chuyển đổi sang loại danh sách chung chung, nó có thể là tốt hơn để sử dụng constructor mà mất IEnumerable loại (một cái gì đó ArrayList nên thực hiện đã.)

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>(arrayList); 
Các vấn đề liên quan