2012-03-10 19 views
6

Tôi có danh sách lưu trữ một số đối tượng hay không. Mỗi đối tượng có một thuộc tính dưới dạng một biến.Cấu trúc dữ liệu nhanh nhất để kiểm tra xem một thuộc tính trong danh sách đối tượng có khớp với

Tôi muốn kiểm tra xem có bất kỳ mục nào trong danh sách này có chứa thuộc tính nhất định hay không. Tương tự như phương thức ContainsKey của Dictionary. Cấu trúc dữ liệu này là để giữ một số lượng cực lớn các giá trị, thậm chí có thể hàng triệu và do đó tôi muốn sử dụng một cấu trúc dữ liệu có thể kiểm tra các thuộc tính càng nhanh càng tốt.

Từ điển sẽ là nhanh nhất cho công việc này hoặc có cấu trúc dữ liệu nhanh hơn không?

EDIT:

Dưới đây là một cách nhanh chóng, ví dụ nhỏ về những gì tôi muốn đạt được:

Dictionary<string, Person> persons = new Dictionary<string, Person>(); //where string contains the Person's name 

bool isPresent = persons.ContainsKey("Matt"); 
+1

Hàng triệu bản ghi này đến từ đâu? An IEnumerable so với nguồn dữ liệu để * truy vấn * dữ liệu là nhanh nhất. Tải hàng triệu bản ghi vào bộ nhớ là không thực tế. Hãy để cơ sở dữ liệu/NOSQL thực hiện việc nâng hạng nặng thông qua LINQ. – tawman

+0

Bạn có biết loại và thuộc tính trước không. I E. Bạn có đang thử nghiệm các đối tượng "Đặt hàng" cho thuộc tính "Vùng" không? Hoặc là nó là một đối tượng không rõ cho một tài sản cố định tên? Hoặc nó có thể sử dụng năng động? Hoặc nếu thành viên không cố định, có thể là FastMember? Hoặc là...? Hoặc là...? Vui lòng thêm một ví dụ ... –

+0

@tawman: Có hàng triệu bản ghi trong bộ nhớ có thể * hoàn toàn * thực tế (và nhanh chóng) tùy thuộc vào kích thước của bản ghi. Trong một công việc trước đây, tôi quản lý để tăng hiệu suất * cực kỳ * bằng cách chuyển đổi mã đang thực hiện tra cứu trong bảng cơ sở dữ liệu thành một bảng trong bộ nhớ, được điều chỉnh để giảm mức sử dụng bộ nhớ. Tất cả đều phụ thuộc vào ngữ cảnh. –

Trả lời

6

Có vẻ như bạn về cơ bản chỉ cần một HashSet<T> chứa tất cả các giá trị tài sản - giả bạn thực sự chỉ muốn biết liệu nó có chứa hay không.

Ví dụ:

var allNames = new HashSet<string>(people.Select(person => person.Name)); 
+1

Tôi đã chỉnh sửa câu hỏi của mình để trình bày một ví dụ nhanh về những gì tôi đang theo dõi. HashSet có nhanh hơn một từ điển trong trường hợp cụ thể của tôi không? –

+0

@Sean: Có khả năng - bạn có thể nhận được sự kết hợp bộ nhớ cache tốt hơn vì không có "giá trị" để lưu trữ. Nó chắc chắn sẽ có nhiều bộ nhớ hiệu quả hơn (giả sử thực hiện hợp lý). Quan trọng hơn, một bộ đại diện cho những gì bạn quan tâm (sự hiện diện hoặc vắng mặt của một cái gì đó) chính xác hơn một từ điển (đại diện cho một khóa/giá trị * ánh xạ *). –

+0

Khi bạn đặt nó theo cách đó, có vẻ như nó phù hợp hơn với vấn đề cụ thể của tôi. Như bạn đã đề cập, một ánh xạ khóa/giá trị, mặc dù có trong ví dụ của tôi, chỉ là một phương tiện để kết thúc - có thể hầu hết có thể vẫn được minh họa thông qua một HashSet. Tôi sẽ thử nó, cảm ơn! –

0

Nó phụ thuộc. Nếu bạn có thể tải dữ liệu vào một từ điển một lần và sau đó truy vấn nó nhiều lần, thì một từ điển rõ ràng là cấu trúc dữ liệu nhanh nhất có thể. Nếu một số mục có thể có cùng một giá trị thuộc tính, bạn sẽ phải tạo một Dictionary<TKey,List<TValue>> hoặc sử dụng Tìm kiếm LINQ.

Tuy nhiên, nếu bạn phải tải danh sách mỗi khi bạn truy vấn, thì sẽ không có lợi ích khi sử dụng từ điển. Bạn có thể phát hiện các thuộc tính thích hợp trong khi tải danh sách hoặc, nếu bạn đang truy vấn một cơ sở dữ liệu, sau đó thử tải dữ liệu cần thiết bằng cách sử dụng một mệnh đề where thích hợp.

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