2009-03-25 35 views
5

Tôi có một tập hợp các chuỗi (~ 80 000) Tôi chỉ có thể truy cập tuần tự bằng các phương thức hits.Doc (int) .Get ("fieldName").Cách nhanh nhất để tạo danh sách các chuỗi duy nhất từ ​​trong vòng lặp?

List<string> idStrings = new List<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) 
{ 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.Contains(idString)) 
     idStrings.Add(idString); 
} 

Các chuỗi sau này phải là int.TryParse() 'd. Tôi nghĩ rằng nên có một cách nhanh hơn để làm điều này. Bất kỳ đề xuất?

Trả lời

13

Trước hết, sử dụng một Hashset<string> thay vì một danh sách, phương pháp Chứa sẽ đi nhanh hơn:

int count = hits.Length(); 
Hashset<string> idStrings = new Hashset<string>(); 

EDIT: Bạn không cần phải gọi là "Có" nếu bạn sử dụng một Hashset vì nó có thể không chứa các mục trùng lặp. Chỉ cần sử dụng Thêm, nó sẽ tự động loại bỏ các giá trị trùng lặp.

+1

Đồng ý - List.Contains() là một O (n) chức năng. HashSet.Contains là O (1). – itsmatt

+0

Tuyệt vời, đây là những gì tôi nghĩ tôi nên nhớ, nhưng không. Hy vọng rằng làm cho sence cho bất cứ ai: P –

+0

Xin lưu ý không có quá tải để thiết lập năng lực của một int. –

0

Câu lệnh làm chậm mã của bạn là idStrings.Contains(idString).

Bạn có thể thử sử dụng cấu trúc dữ liệu nhanh hơn List (một cây hoặc bảng băm, có thể?).

Cụ thể, bạn cần cấu trúc dữ liệu với thời gian tìm kiếm tuyến tính phụ. Bảng băm có thời gian tìm kiếm liên tục, trong khi cây thường có thời gian tìm kiếm logarit.

1

Sử dụng Dictionary thay vì List. Phương pháp Dictionary.ContainsKey nhanh hơn nhiều so với phương pháp List.Contains.

Dictionary<string, int> idStrings = new Dictionary<string, int>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    if (!idStrings.ContainsKey(idString)) { 
     idStrings.Add(idString, 1); 
    } 
} 

Nếu bạn sử dụng framework 3.5 bạn có thể sử dụng một HashSet thay vì một Dictionary:

HashSet<string> idStrings = new HashSet<string>(); 
int count = hits.Length(); 
for (int i = 0; i < count; i++) { 
    string idString = hits.Doc(i).Get("id"); 
    idStrings.Add(idString); 
} 
Các vấn đề liên quan