2008-10-02 19 views
9

Bạn sẽ đề xuất gì cho lớp học cần giữ một danh sách các số nguyên duy nhất?Lớp .NET được đề xuất cho tập hợp các số nguyên duy nhất?

Tôi sẽ muốn Thêm() số nguyên vào bộ sưu tập và cũng kiểm tra sự tồn tại, ví dụ: Chứa đựng().

Sẽ rất hay để có được chúng trong danh sách dưới dạng chuỗi để hiển thị, ví dụ: "1, 5, 10, 21".

+1

Xin lỗi tôi đã không chỉ định. Tôi có thể sử dụng khung công tác mới nhất. 3,5 nhưng câu trả lời của bạn có thể giúp người khác không thể sử dụng phiên bản mới nhất. –

Trả lời

24

HashSet:

Lớp HashSet<T> cung cấp thiết lập hoạt động hiệu suất cao. Tập hợp là tập hợp không chứa các phần tử trùng lặp và các phần tử của chúng không có thứ tự cụ thể ...

Công suất của đối tượng HashSet<T> là số phần tử mà đối tượng có thể giữ. Khả năng của một đối tượng HashSet<T> tự động tăng khi các phần tử được thêm vào đối tượng.

Lớp HashSet<T> dựa trên mô hình toán học và cung cấp các hoạt động thiết lập hiệu suất cao tương tự như truy cập các khóa của bộ sưu tập Dictionary<TKey, TValue> hoặc Hashtable. Nói một cách đơn giản, lớp HashSet<T> có thể được coi là bộ sưu tập Dictionary<TKey, TValue> không có giá trị.

Một bộ sưu tập HashSet<T> không được sắp xếp và không thể chứa các thành phần trùng lặp ...

+0

Tôi đã xem danh sách mảng và chắc chắn là tốt hơn danh sách theo mảng, vì vậy tôi đã xóa câu trả lời trước đó của mình. – EBGreen

+1

HashSet sẽ ToString loại ... không phải là danh sách. Và danh sách mà anh ta đang hiển thị là một trong những thứ tự mà HashSet không hỗ trợ. – MagicKat

+0

Chính xác. Để có được danh sách chuỗi, bạn sẽ sử dụng mã như: int [] a = h.ToArray (); Mảng.Sắp xếp (a); string.Join (',', a); Đây không phải là hiệu suất cao, nhưng tôi nhận được ấn tượng nó không phải là một hoạt động phổ biến, và là nhiều hơn cho gỡ lỗi/xem hơn tính toán. –

2

Nếu bạn không thể sử dụng .NET 3.5, sau đó bạn có thể không sử dụng HashSet. Nếu đúng như vậy, bạn có thể dễ dàng tự cuộn dựa trên cấu trúc Từ điển.

public class Set<T> { 
    private class Unit { ... no behavior } 
    private Dictionary<T, Unit> d; 

.... 
} 

Đơn vị được dự định là loại có chính xác một giá trị. Việc bạn ánh xạ các phần tử đến là gì, chỉ cần sử dụng các phím để biết nội dung trong bộ của bạn. Các hoạt động bạn yêu cầu trong câu hỏi rất đơn giản để thực hiện.

+1

Tại sao thậm chí tạo các lớp 'Đơn vị'? Giá trị có thể là 'null'. –

+0

Loại sẽ là gì? "vật"? – EfForEffort

+1

Có, từ điển sẽ hoạt động tốt cho việc này. –

1

bạn có thể kế thừa lớp học từ KeyedCollection. Bằng cách này, khóa của bạn có thể là chính bản thân giá trị, bạn có thể ghi đè lên ToString để bạn có được kết quả mong muốn. Điều này có thể cung cấp cho bạn hành vi bạn muốn/cần.

Note, câu trả lời này là dành cho khuôn khổ 2.0 phần của Q

3

Trong thử nghiệm của tôi, tôi đã tìm thấy rằng một từ điển với một giá trị giả là nhanh hơn so với một HashSet, khi giao dịch với bộ rất lớn dữ liệu (100.000+ trong trường hợp của tôi). Tôi hy vọng điều này là bởi vì từ điển cho phép bạn thiết lập một công suất ban đầu, nhưng tôi không thực sự biết. Trong trường hợp bạn mô tả, tôi có thể sử dụng từ điển nếu tôi mong đợi một số lượng lớn các con số, và sau đó (hoặc khi tôi thêm vào từ điển, tùy thuộc vào ý định) lặp lại nó bằng cách sử dụng trình tạo chuỗi, để tạo chuỗi đầu ra.

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