2009-02-21 31 views
7

Tôi có một lớp Customer (với các thuộc tính khách hàng điển hình) và tôi cần phải chuyển xung quanh, và dữ liệu, một "đoạn" của các trường hợp Customer. Hiện tại tôi đang sử dụng một mảng gồm Customer, nhưng tôi cũng đã sử dụng Collection của T (và List của T trước khi tôi biết về Collection của T). Tôi muốn cách nhỏ nhất để vượt qua đoạn này xung quanh bằng cách sử dụng C# và .NET 3.5.ArrayList so với một mảng đối tượng so với Bộ sưu tập của T

Hiện tại, mảng Customer đang hoạt động tốt cho tôi. Dữ liệu liên kết tốt và có vẻ nhẹ như nó nhận được. Tôi không cần công cụ List của số T phiếu mua hàng và Collection trong số T vẫn có vẻ quá mức cần thiết. Các mảng không yêu cầu tôi biết trước thời gian bao nhiêu Customer s tôi đang thêm vào đoạn, nhưng tôi luôn luôn biết rằng trước (các hàng nhất định trong một trang, ví dụ).

Tôi có thiếu thứ gì đó cơ bản hoặc là mảng của Customer OK? Có một sự cân bằng tôi đang thiếu?

Ngoài ra, tôi giả định rằng Collection của T làm cho kiểu cũ bị lỗi ArrayList lỗi thời. Tôi có ở đó không?

Trả lời

4

Không ai có đề cập những lời khuyên hướng dẫn Khung: Don't use List<T> in public API's:

Chúng tôi không khuyên bạn sử dụng List trong API công cộng vì hai lý do.

  • List<T> không được thiết kế để mở rộng. tức là bạn không thể ghi đè bất kỳ thành viên nào. Ví dụ: điều này có nghĩa là đối tượng trả về List<T> từ thuộc tính sẽ không thể nhận được thông báo khi bộ sưu tập được sửa đổi. Collection<T> cho phép bạn ghi đè thành viên được bảo vệ SetItem để nhận “được thông báo” khi một mục mới được thêm hoặc một mục hiện có được thay đổi.

  • Danh sách có nhiều thành viên không liên quan đến nhiều trường hợp. Chúng tôi nói rằng List<T> quá “bận” đối với mô hình đối tượng công khai. Hãy tưởng tượng Thuộc tính ListView.Items trả lại List<T> với tất cả sự phong phú của nó. Bây giờ, xem loại trả lại ListView.Items thực tế; đó là cách đơn giản và tương tự như Collection<T> hoặc ReadOnlyCollection<T>

Ngoài ra, nếu mục tiêu của bạn là hai chiều Databinding, có một cái nhìn tại BindingList<T> (với sự báo trước rằng nó không phải là sắp xếp được 'ra khỏi hộp '!)

11

Có, Collection<T> (hoặc List<T> phổ biến hơn) làm cho ArrayList khá nhiều lỗi thời. Đặc biệt, tôi tin rằng ArrayList thậm chí không được hỗ trợ trong Silverlight 2.

Mảng có thể trong một số trường hợp, nhưng phải là considered somewhat harmful - chúng có nhiều nhược điểm. (Chúng là trung tâm của việc thực hiện của hầu hết các bộ sưu tập, tất nhiên ...) Tôi sẽ đi sâu vào chi tiết hơn, nhưng Eric Lippert làm tốt hơn nhiều so với tôi có thể tham khảo trong bài viết. Tôi sẽ tóm tắt nó ở đây, nhưng đó là khá khó để làm. Nó thực sự là giá trị chỉ đọc toàn bộ bài viết.

+0

Anh ấy làm một công việc tuyệt vời trong bài viết đó, một bài đọc tốt cho bất kỳ ai chưa có. –

3

Nói chung, bạn nên 'đi qua' IEnumerable <T> hoặc ICollection <T> (tùy thuộc vào việc người tiêu dùng có thêm mục) hay không.

0

Tôi sẽ đặt vào một đối số bất đồng với cả Jon và Eric Lippert) có nghĩa là bạn sẽ rất mệt mỏi với câu trả lời của tôi, thực sự!).

Trọng tâm của các đối số của Eric Lippert đối với mảng là nội dung không thay đổi, trong khi bản thân cấu trúc dữ liệu thì không. Liên quan đến việc trả lại chúng từ các phương thức, nội dung của Danh sách cũng giống như có thể thay đổi. Thực tế, bởi vì bạn có thể thêm hoặc trừ các phần tử từ một Danh sách, tôi cho rằng điều này làm cho giá trị trả về nhiều hơn có thể thay đổi so với mảng.

Lý do khác tôi thích mảng là bởi vì đôi khi trở lại tôi có một phần nhỏ của mã quan trọng hiệu suất, vì vậy tôi đã đánh giá các đặc tính hiệu suất của hai, và mảng thổi Danh sách ra khỏi nước. Bây giờ, hãy để tôi báo trước điều này bằng cách nói rằng đó là một bài kiểm tra hẹp về cách tôi sẽ sử dụng chúng trong một tình huống cụ thể, và nó đi ngược lại những gì tôi hiểu về cả hai, nhưng những con số thì khác hẳn.

Dù sao, hãy nghe Jon và Eric =) và tôi đồng ý rằng Danh sách hầu như luôn có ý nghĩa hơn.

+0

Có những nơi chắc chắn có ý nghĩa khi sử dụng mảng và chúng thực sự sẽ hoạt động tốt hơn. Đó là lý do để sử dụng chúng * trong đó hiệu suất là rất quan trọng * (không phải là nhiều nơi IME).Đối với đối số bất biến: nếu bạn khai báo rằng một phương thức trả về Foo [] thì nó sẽ * luôn luôn * có thể thay đổi được. –

+0

Nếu, mặt khác, bạn tuyên bố rằng nó trả về IL sau đó giá trị trả về * có thể * có thể thay đổi hoặc nó có thể * không thay đổi - và bạn có thể dễ dàng xây dựng một trình bao bọc chỉ đọc. Nó không phải là quá nhiều một trường hợp của "mảng vs Danh sách " là "mảng vs một giao diện" cho các loại trả lại. –

+0

Mặc dù vậy, bạn không thể trả về một mảng của IImmutableObject []? Tôi không cố gắng tranh luận, nhưng lập luận đó chưa bao giờ có ý nghĩa đối với tôi. (Trong trường hợp bất kỳ ai tìm thấy đối số của tôi hấp dẫn, vui lòng sử dụng Danh sách , vì đó là điều đúng để làm trong 99,9% trường hợp). – Travis

0

Tôi đồng ý với Alun, với một bổ sung. Nếu bạn có thể muốn trả về giá trị trả về bằng chỉ số myArray [n], thì hãy sử dụng IList.

Một mảng vốn đã hỗ trợ IList (cũng như IEnumerable và ICollection, cho vấn đề đó). Vì vậy, nếu bạn đi qua giao diện, bạn vẫn có thể sử dụng mảng làm cấu trúc dữ liệu cơ bản của mình. Bằng cách này, các phương thức mà bạn đang chuyển mảng vào không phải "biết" rằng cơ sở hạ tầng cơ bản là một mảng:

 public void Test() 
{ 
    IList<Item> test = MyMethod(); 
} 

public IList<Item> MyMethod() 
{ 
    Item[] items = new Item[] {new Item()}; 
    return items; 
} 
1

Nếu bạn có danh sách không thay đổi của khách hàng ... danh sách khách hàng của bạn sẽ không thay đổi, nó tương đối nhỏ, và bạn sẽ luôn luôn lặp qua nó đầu tiên và bạn không cần phải thêm vào danh sách hoặc loại bỏ nó, sau đó một mảng có lẽ là tốt.

Nếu bạn không chắc chắn, thì đặt cược tốt nhất của bạn là tập hợp một số loại. Bộ sưu tập bạn chọn phụ thuộc vào các hoạt động bạn muốn thực hiện trên đó. Bộ sưu tập là tất cả về chèn, thao tác, tra cứu và xóa. Nếu bạn thường xuyên tìm kiếm một phần tử đã cho, thì từ điển có thể là tốt nhất. Nếu bạn cần sắp xếp dữ liệu, thì có lẽ một SortedList sẽ hoạt động tốt hơn.

Tôi sẽ không lo lắng về "nhẹ", trừ khi bạn đang nói một số lượng lớn các yếu tố, và thậm chí sau đó lợi thế của O (1) tra cứu lớn hơn chi phí tài nguyên.

Khi bạn "đi qua" một bộ sưu tập, bạn chỉ chuyển một tham chiếu, về cơ bản là một con trỏ. Vì vậy, không có sự khác biệt về hiệu suất giữa việc truyền một bộ sưu tập và một mảng.

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