2011-01-14 13 views
6

Tôi đang tìm một bộ sưu tập đơn giản sẽ lưu trữ một chuỗi các chuỗi trong một trường hợp không nhạy cảm cách. Tôi cần ít nhất một phương thức Contains()Remove() để xem một chuỗi nhất định có hiện diện hay không và xóa chuỗi đó.Muốn: bộ sưu tập .Net lưu trữ một loạt các chuỗi phân biệt chữ hoa chữ thường nhanh và hiệu quả

Tôi đã thử List<string> nhưng đó là trường hợp nhạy cảm. Tôi cần có thể sử dụng một trường hợp không nhạy cảm Dictionary<TKey, T>, nhưng điều đó "cảm thấy" như một sự lãng phí không gian. Làm một ToLower() trên mỗi chuỗi là một sự lãng phí hiệu suất.

Có ai biết loại bộ sưu tập Net nào tôi nên sử dụng không?

+0

Khi bạn nói "một chuỗi các chuỗi", chúng ta đang nói về bao nhiêu? –

+0

Bạn có thể sử dụng Danh sách như trước đây bạn đã cố gắng và vượt qua trong StringComparer.OrdinalIgnoreCase như SLaks đã nêu khi gọi Contains –

+0

+/- 10k của các mục và tôi sẽ cần phải kiểm tra bộ sưu tập này khá thường xuyên. –

Trả lời

18

Bạn nên sử dụng new HashSet<string>(StringComparer.OrdinalIgnoreCase).
Lưu ý rằng đây là một tập hợp không có thứ tự.

+0

Ý nghĩa của sự hoàn hảo của một tập hợp không có thứ tự. Có phiên bản đặt hàng ngoài kia không? –

+0

Các bộ sưu tập không theo thứ tự sẽ luôn nhanh hơn các bộ sưu tập được sắp xếp của chúng, vì các yêu cầu về lỏng lẻo hơn. – Blindy

+1

Tài liệu nói rằng Chứa và Xoá là một hoạt động O (1). http://msdn.microsoft.com/en-us/library/bb383091%28v=VS.90%29.aspx – Greg

2

Bạn có thể sử dụng số StringDictionary.

+3

Đó là một sự lãng phí các giá trị. – SLaks

+0

Chắc chắn, tôi đoán nếu bạn không phải là keying với văn bản khác với văn bản chèn có lẽ nó không thích hợp. – Reddog

+0

chúng tôi vẫn có vấn đề về các giá trị kép trong bộ nhớ. –

-1

Viết các phương thức Contains()Remove() của riêng bạn, thực hiện so sánh trường hợp không phân biệt.

+0

Giải pháp của bạn nhanh hơn HashSet đã được đề xuất như thế nào? –

+0

Có thể là không. – Nate

+0

Chứa phương pháp mở rộng có sự so sánh đã tồn tại trong khung công tác. –

0

Đã xảy ra sự cố tương tự để giải quyết ngay hôm nay. Nếu bạn có thể bao gồm LINQ, thì Danh sách của bạn sẽ nhận các phương thức quá tải với một trình so sánh.

using System.Linq; 

List<string> stringList = new List<string>(); 
stringList.Contains("hello", StringComparer.OrdinalIgnoreCase); 

Hope this helps: Martin

+0

Thật không may LINQ là 3.5 và tôi đang phát triển cho 2.0. Vấn đề với giải pháp của bạn là các thùng chứa sẽ có O (N) và tôi đang thiếu một chức năng loại bỏ. Có vẻ như HashSet sẽ mang lại hiệu suất tốt nhất. –

0

By từ điển mặc định là không trường hợp nhạy cảm. Nhưng bạn có thể thực hiện các biến thể của riêng bạn để làm cho nó trở nên nhạy cảm. (Tôi có thể sai về điều này: D)

Tôi đã gặp vấn đề tương tự với Từ điển nhưng sau khi thử nhiều triển khai IEquality, cuối cùng tôi đã giải quyết điểm số với LINQ.

string k = customers.Where(c => c.Key.Equals(valueToSearch, StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Key; 

if (!string.IsNullOrEmpty(k) && k.ToUpper() == valueToSearch.ToUpper()) 
{ 
    // Do some thing 
} 

Hy vọng điều này sẽ giúp ai đó trong tương lai.

Sanjay Zalke

+0

Cảm ơn bạn đã bình luận. Vấn đề với từ điển là bạn có cặp khóa/giá trị. Tôi chỉ cần biết nếu chuỗi có mặt. Không cần phần 'giá trị'. Vì vậy, sử dụng một từ điển sẽ lãng phí không gian bộ nhớ. –

+0

Hi Kees, thực hiện này không phải là ở tất cả các liên quan chỉ để từ điển, nhưng nó là LINQ vì vậy nó áp dụng cho tất cả các đối tượng trong .net bao gồm cả cơ sở dữ liệu. Nếu bạn có danh sách sử dụng: [code] (string k = customers.Where (c => c.Equals (valueToSearch, StringComparison.OrdinalIgnoreCase)). FirstOrDefault();) –

+0

Ah hiểu rồi. Vấn đề là tôi đang sử dụng .Net 2.0. Nó vẫn có vẻ là 'mới HashSet (StringComparer.OrdinalIgnoreCase)' là nhanh nhất vì nó là O (1). Mã của bạn sử dụng một cho, mà làm cho nó O (N). –

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