Il OrderedDictionary
sovraccarica l'operazione di indicizzazione in modo che l'indicizzazione con un intero N
ottenga l'elemento in posizione N
, mentre l'indicizzazione con Object
recupererà l'elemento corrispondente a quell'oggetto. Se si dovesse creare un OrderedDictionary<int, string>
chiamato myDict
e aggiunto elementi (1, "George") e (0, "Fred") in quell'ordine, dovrebbe myDict[0]
restituire "George" o "Fred"?
Tale problema avrebbe potuto essere risolto imponendo un vincolo di classe sul tipo di chiave. D'altra parte, gran parte dell'utilità delle raccolte generiche deriva dalla loro capacità di lavorare efficientemente con i tipi di valore. Imporre un vincolo di classe sul tipo di chiave sembrerebbe un po 'brutto.
Se la classe non doveva essere compatibile con CLS ma doveva semplicemente funzionare con vb.net, un progetto ragionevole avrebbe potuto essere utilizzato per le proprietà indicizzate con nome. Pertanto, nell'esempio precedente, myDict.ByKey[0]
avrebbe restituito "Fred" e myDict.BySequence[0]
avrebbe restituito "George". Sfortunatamente, linguaggi come C # non supportano le proprietà indicizzate con nome. Mentre si potrebbe avere qualcosa che permetta l'uso della sintassi precedente anche senza tali proprietà, la sfortunata decisione di avvolgere i campi di strutture come Point
e Rectangle
significa che per myDict.ByKey[0] = "Wally"
funzionare, myDict.ByKey
dovrebbe restituisce un nuovo oggetto di classe. Una struct sarebbe più efficiente, ma i compilatori rifiuterebbero quella che sembrava una scrittura in una struttura di sola lettura (nonostante la proprietà non modificasse la struct restituita da ByKey
, ma modificasse invece la collection a cui tiene un riferimento ).
Personalmente, penso che un oggetto dizionario-ish che è stato specificato per tenere traccia dell'ordine di inserimento sarebbe una cosa carina da avere; Mi piacerebbe anche avere un oggetto dizionario-ish che potrebbe facilmente restituire la chiave associata a una particolare chiave (in modo che, ad esempio, se uno abbia un dizionario insensibile alle maiuscole e minuscole e abbia aggiunto un record con una chiave di "GEORGE", uno potrebbe chiedere al dizionario quale chiave è associata a "George" senza dover cercare tra tutti gli oggetti KeyValuePair
restituiti in un'enumerazione.