Un NameValueCollection in .NET è fondamentalmente ciò che viene utilizzato per QueryStrings per contenere coppie chiave/valore. La più grande differenza è quando vengono aggiunti due elementi con la stessa chiave. Con IDictionary, ci sono due modi per impostare un valore. L'utilizzo del metodo .Add() genera un errore su una chiave duplicata quando la chiave esiste già. Ma semplicemente impostando la voce uguale a un valore si sovrascriverà il valore. In questo modo IDictionary gestisce le chiavi duplicate. Ma NameValueCollection aggiungerà valori come questo: "valore1, valore2, valore3". Quindi il valore dell'elemento esistente viene aggiunto con una virgola, quindi il nuovo valore viene aggiunto ogni volta.
Mi sembra che questo NameValueCollection sia stato creato appositamente per l'utilizzo e l'accesso di QueryString. Un oggetto QueryString come "? A = 1 & b = 2 & a = 3" in .NET produrrà un risultato dell'articolo ["a"] = "1,3". Questa differenza di come vengono trattate le chiavi duplicate è la differenza "reale", cioè la più grande differenza tra i due.
I sospetto che un NameValueCollection non utilizza alcuna tabella hash per l'accesso rapido delle chiavi quando la raccolta è grande perché questo accesso è più lento per le raccolte di piccole dimensioni che senza la tabella hash. Non ho trovato informazioni definitive che indicano se un NameValueCollection fa o non usa una tabella hash per accedere alle chiavi. I do sa che un IDictionary usa una tabella hash in modo che l'accesso alle chiavi in un IDictionary con molte chiavi sia abbastanza veloce. Quindi io sospetto che un NameValueCollection è più veloce per le piccole raccolte di un IDictionary. Se la mia ipotesi è corretta, vuol dire che non si usa mai uno shud NameValueCollection per le raccolte di grandi dimensioni poiché più grande è, rallenta in modo massivo senza una tabella hash per accedere alle chiavi.
Per il numero di chiavi in una querystring, questo numero è normalmente molto piccolo, quindi i wud indovinare il NameValueCollection fa non uso hash, per migliorare le prestazioni.Ma se Microsoft ha progettato le cose per le prestazioni e per ciò che è meglio per i propri utenti, Windows è quindi diverso da quello attuale. Quindi non possiamo assumere nulla che 'shud essere'.
Inoltre, voglio chiarire un reclamo non corretto dalla risposta più popolare votata a questa domanda. Il commento di Kateroh al di sotto della risposta sbagliata dice che va bene, che non ho bisogno di aggiungere nulla ad esso. Ma ripeto il commento di Kateroh qui così solo forse più persone capiranno che la risposta più popolare è errata. Kateroh indica correttamente:
fonte
2016-01-22 16:17:33
NameValueCollection supporta anche più di un valore per chiave (necessario per stringhe di query, ecc.). –
Non vero. Secondo questo articolo di msdn su namevaluecollection: http://msdn.microsoft.com/en-us/library/system.collections.specialized.namevaluecollection.aspx "Le raccolte di questo tipo non conservano l'ordinamento dell'elemento e no l'ordine particolare è garantito quando si enumera la collezione. " – kateroh