2009-03-06 33 views
29

Tôi có một kịch bản trong đó tôi có thể sử dụng NameValueCollection hoặc IDictionary. Nhưng tôi muốn biết cái nào sẽ hiệu quả hơn.IDictionary <string, string> hoặc NameValueCollection

- Sử dụng NameValueCollection

NameValueCollection options() 
{ 
    NameValueCollection nc = new NameValueCollection(); 

    nc = ....; //populate nc here 

    if(sorting) 
     //sort NameValueCollection nc here 

    return nc; 
} 

- sử dụng IDictionary

IDictionary<string, string> options() 
{ 
    Dictionary<string, string> optionDictionary = new Dictionary<string, string>(); 

    optionDictionary = ....; //populate 

    if(sorting) 
     return new SortedDictionary<string, string>(optionDictionary); 
    else 
     return optionDictionary; 
} 

Trả lời

28

Những loại bộ sưu tập không chính xác hoán đổi cho nhau: NameValueCollection cho phép truy cập thông qua các chỉ số số nguyên. Nếu bạn không cần chức năng đó, bạn không nên sử dụng NameValueCollection vì việc lập chỉ mục không đến "miễn phí".

Tùy thuộc vào số chuỗi bạn đang xem, tôi sẽ xem xét Hashtable hoặc IDictionary. Krzysztof Cwalina thảo luận về sự tinh tế ở đây: http://blogs.gotdotnet.com/kcwalina/archive/2004/08/06/210297.aspx.

+11

NameValueCollection cũng hỗ trợ nhiều giá trị cho mỗi khóa (cần thiết cho chuỗi truy vấn, v.v.). –

+15

Không đúng sự thật. Theo bài viết msdn này về namevaluecollection: http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx "Bộ sưu tập loại này không giữ nguyên thứ tự của phần tử, và không có đặt hàng cụ thể được đảm bảo khi liệt kê bộ sưu tập. " – kateroh

9

Ưu điểm khác của IDictionary là nó không thực hiện cụ thể không giống như NameValueCollection.

+0

'implimentation specific' có nghĩa là gì? –

+0

'NameValueCollection' là một loại cụ thể. 'IDictionary' là một giao diện. Vì vậy, với giao diện bạn có sự linh hoạt hơn vì bạn có thể sử dụng bất kỳ lớp cụ thể nào thực hiện giao diện đó. – Fred

4

Tôi đồng ý với fatcat và lomaxx (và được bỏ phiếu cho cả hai câu trả lời). Tôi sẽ thêm rằng hiệu suất của các loại bộ sưu tập nên rất có thể là xem xét cuối cùng khi lựa chọn giữa các loại bộ sưu tập. Sử dụng loại phù hợp nhất với nhu cầu sử dụng của bạn. Nếu bạn đang ở trong phần hiệu năng quan trọng của mã (và rất có thể là bạn không), thì câu trả lời duy nhất là đo lường từng trường hợp - đừng tin vào Interweb, hãy tin vào các con số.

+0

+1 cho cảnh báo Interweb. Đó là một cách Jack Black để trở thành Aristotelian và thúc đẩy sử dụng trivium. –

+0

thực sự? không phải là hiệu suất lý do duy nhất tại sao các loại bộ sưu tập khác nhau tồn tại? nếu không chúng tôi sẽ chỉ sử dụng Danh sách cho mọi thứ. – Spongman

2

Tên NameValueCollection trong .NET về cơ bản là những gì được sử dụng cho QueryStrings để giữ cặp khóa/giá trị. Sự khác biệt lớn nhất là khi hai mục có cùng khóa được thêm vào. Với IDictionary, có hai cách để đặt giá trị. Sử dụng phương thức .Add() sẽ ném một lỗi trên một khóa trùng lặp khi khóa đã tồn tại. Nhưng chỉ cần đặt mục bằng giá trị sẽ ghi đè lên giá trị. Đây là cách IDictionary xử lý các khóa trùng lặp. Nhưng NameValueCollection sẽ thêm các giá trị như thế này: "value1, value2, value3". Vì vậy, giá trị mục hiện tại được nối thêm bằng dấu phẩy, sau đó giá trị mới được thêm vào mỗi lần.

Dường như với tôi rằng NameValueCollection này được tạo riêng cho truy cập và sử dụng QueryString. QueryString như "? A = 1 & b = 2 & a = 3" trong .NET sẽ cho kết quả của mục ["a"] = "1,3". Sự khác biệt về cách các khóa trùng lặp được xử lý là sự khác biệt 'thực sự', đó là sự khác biệt lớn nhất giữa hai phím.

I nghi ngờ rằng NameValueCollection cũng không sử dụng bảng băm để truy cập nhanh các khóa khi bộ sưu tập lớn vì truy cập này chậm hơn cho các bộ sưu tập nhỏ hơn mà không có bảng băm. Tôi đã không tìm thấy thông tin dứt khoát cho biết một NameValueCollection có hay không sử dụng một bảng băm để truy cập các khóa. Tôi do biết rằng một IDictionary sử dụng một bảng băm để truy cập các khóa trong một IDictionary với nhiều khóa là khá nhanh. Vì vậy, tôi nghi ngờ rằng NameValueCollection nhanh hơn cho các bộ sưu tập nhỏ hơn IDictionary. Nếu đoán của tôi là chính xác, sau đó nó có nghĩa là một shud NameValueCollection không có nghĩa là được sử dụng cho các bộ sưu tập lớn kể từ khi nó lớn hơn, nó ồ ạt chậm mà không có một bảng băm để truy cập các phím.

Đối với số lượng các phím trong một chuỗi truy vấn, con số này là bình thường rất nhỏ, vì vậy tôi wud đoán các NameValueCollection không không băm sử dụng, cho hiệu suất tốt hơn.Nhưng nếu Microsoft thiết kế mọi thứ cho hiệu suất, và cho những gì tốt nhất cho người dùng của họ, Windows wud là để khác với ngày hôm nay. Vì vậy, chúng tôi không thể giả định bất cứ điều gì mà 'shud được'.

Ngoài ra, tôi muốn làm rõ xác nhận quyền sở hữu không đúng bằng câu trả lời được bình chọn phổ biến nhất cho câu hỏi này. Nhận xét của Kateroh bên dưới câu trả lời không chính xác nói rằng nó cũng enuf, rằng tôi không cần phải thêm bất cứ điều gì cho nó. Nhưng tôi lặp lại bình luận của Kateroh ở đây vì vậy chỉ có thể nhiều người hơn sẽ nhận ra rằng câu trả lời phổ biến nhất là sai. Kateroh khẳng định một cách chính xác:

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