2011-12-24 32 views
7

Tôi có khoảng 10.000 hồ sơ. Mỗi bản ghi có 2 trường: một trường là một chuỗi dài tối đa 300 ký tự và trường khác là giá trị thập phân. Điều này giống như một danh mục sản phẩm có tên sản phẩm và giá của mỗi sản phẩm.Tôi nên sử dụng loại bộ sưu tập nào?

Những gì tôi cần làm là cho phép người dùng nhập bất kỳ từ nào và hiển thị tất cả các sản phẩm có chứa từ đó cùng với giá của chúng trong hộp danh sách. Đó là tất cả.

  1. Loại bộ sưu tập nào là tốt nhất cho trường hợp này?
  2. Nếu tôi cần sắp xếp dựa trên tên hoặc giá sản phẩm, liệu lựa chọn vẫn giống nhau không?

Hiện tại tôi đang sử dụng tệp XML nhưng tôi đã nghĩ sử dụng bộ sưu tập để tôi có thể nhúng tất cả các giá trị trong mã đơn giản hơn. Cảm ơn lời đề nghị của bạn.

+0

Vui lòng không đặt C# vào tiêu đề. Đó là những gì các thẻ cho. – Amy

+0

Không phải bộ sưu tập: Bạn có thể sử dụng SQLLite để lưu trữ dữ liệu và truy cập dữ liệu đó. –

Trả lời

10

Từ điển sẽ thực hiện công việc. Tuy nhiên, nếu bạn đang thực hiện các kết quả khớp từng phần nhanh chóng (ví dụ: tìm kiếm dưới dạng loại người dùng), bạn có thể nhận được hiệu suất tốt hơn bằng cách tạo nhiều khóa trỏ đến cùng một mục. Ví dụ: từ "Apple" có thể được đặt với "Ap", "App", "Appl" và "Apple".

Tôi đã sử dụng phương pháp này trên một số lượng bản ghi tương tự với kết quả rất tốt. Tôi đã biến các nguồn 10K của mình thành khoảng 50K khóa duy nhất. Mỗi mục trong số các mục từ điển này trỏ đến danh sách chứa tham chiếu đến tất cả các kết quả phù hợp cho cụm từ đó. Sau đó bạn có thể tìm kiếm danh sách nhỏ hơn nhiều này hiệu quả hơn. Mặc dù số lượng lớn các danh sách này tạo ra, nhưng bộ nhớ là khá hợp lý.

Bạn cũng có thể tạo khóa riêng nếu muốn chuyển hướng lỗi chính tả phổ biến hoặc trỏ đến các mục có liên quan. Điều này cũng loại bỏ hầu hết các vấn đề với các khóa duy nhất bởi vì mỗi điểm quan trọng vào một danh sách. Một mục có thể được phân loại theo từng từ trong tên của nó; điều này cực kỳ hữu ích nếu bạn có tên sản phẩm dài với nhiều từ trong đó. Khi phân loại các mục của bạn, mỗi từ trong tên có thể được ánh xạ tới một hoặc nhiều khóa.

Tôi cũng nên chỉ ra rằng việc xây dựng và phân loại các hạng mục 10K sẽ không mất nhiều thời gian nếu được thực hiện đúng (vài trăm mili giây là hợp lý). Kết quả có thể được lưu trong bộ nhớ cache miễn là bạn muốn sử dụng Application, Cache hoặc các thành viên tĩnh.

Để tóm tắt, cấu trúc kết quả là Dictionary<string, List<T>> trong đó chuỗi ngắn (2-6 ký tự hoạt động tốt) nhưng khóa duy nhất. Mỗi điểm chính đến một mục List<T> (hoặc bộ sưu tập khác nếu bạn nghiêng) của các mục phù hợp với khóa đó. Khi tìm kiếm được thực hiện, bạn xác định vị trí khóa khớp với cụm từ do người dùng cung cấp. Tùy thuộc vào độ dài của khóa, bạn có thể cắt bớt tìm kiếm của người dùng theo độ dài khóa tối đa của bạn. Sau khi định vị bộ sưu tập con đúng, bạn sau đó tìm kiếm bộ sưu tập đó cho một kết hợp hoàn chỉnh hoặc một phần bằng cách sử dụng bất kỳ phương pháp nào bạn muốn.

Cuối cùng, bạn có thể tạo cấu trúc nhẹ cho mỗi mục trong danh sách để bạn có thể lưu trữ thông tin bổ sung về mục đó. Ví dụ: bạn có thể tạo một lớp Sản phẩm nhỏ lưu trữ tên, giá, bộ phận và mức độ phổ biến của sản phẩm. Điều này có thể giúp bạn tinh chỉnh kết quả bạn hiển thị cho người dùng.

Tất cả trong tất cả, bạn có thể thực hiện tìm kiếm thông minh, chi tiết, mờ trong thời gian thực.

Cấu trúc nói trên phải cung cấp chức năng tương đương gần với trie.

+1

+1 để đề xuất một lớp Sản phẩm, cho thấy cách tiếp cận đối sánh từng phần và dành thời gian để viết câu trả lời hữu ích – Adam

9

Bản ghi 10K không nhiều.

An Dictionary<string,decimal> sẽ khớp với hóa đơn. Bạn có thể sắp xếp theo khóa hoặc bằng giá trị sử dụng LINQ, cũng như tìm kiếm.

Điều này giả định rằng tên sản phẩm là duy nhất.

+0

Tôi đồng ý, nhưng tôi nghĩ nó đáng giá cũng chỉ ra rằng nó sẽ chỉ hoạt động nếu tất cả các chuỗi là duy nhất. – madd0

+0

@ madd0 - Điểm công bằng. Đã cập nhật câu trả lời. – Oded

+0

+1 và bất kỳ giới hạn nào khi chúng ta nên ngừng sử dụng Dictionary hoặc khi nó sẽ quá chậm để có hiệu lực? –

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