L'assenza della classe OrderedDictionary generica nel framework .NET è davvero un difetto di progettazione?

1

Ero assolutamente sicuro di averne bisogno ( e alcuni utenti SO anche ), ma si scopre che il mio caso è stato facilmente rifattorizzato con semplice List<object> , e più ci penso Non sono più sicuro che uno sia necessario e le classi generiche per la raccolta la gestione è sufficiente, sono solo curioso :)

btw. c'è una domanda simile , ma quella domanda presuppone che tale classe sia necessaria, e solo un commento suggerisce che forse non è necessario.

[EDIT] oh f *, ho pensato di scrivere OrderedDictionary non SortedDictionary, scusate gente, modificato il mio post

    
posta Antonio Bakula 13.06.2011 - 02:58
fonte

4 risposte

4

Esiste una classe SortedList che in realtà è un dizionario e potrebbe essere ciò che stavi cercando: non è mancante, ma la denominazione è sicuramente un difetto di progettazione.

    
risposta data 13.06.2011 - 04:26
fonte
1

È difficile dire se si tratti di un difetto di progettazione, in quanto il design di solito corrisponde alle esigenze del cliente, ai casi d'uso, ecc. Senza conoscere i contorni che Microsoft ha identificato (o mancato), nessun risultato conclusivo può essere raggiunto. Sono un mio parere personale, non ho mai avuto bisogno di un tale tipo di dati, e non vedo alcun difetto nel fatto che sia lasciato fuori. Questo non vuol dire che i programmatori che lavorano con il framework non ne abbiano bisogno, ma solo quello non è stato incluso. Se ritieni che uno debba essere incluso nella prossima versione, vai su Microsoft Connect e dillo.

Detto questo, è piuttosto semplice girare il tuo se ne hai bisogno. L'implementazione ingenua (vale a dire prima cosa che mi viene in mente =]) (che potrebbe non essere adatta alle tue esigenze) sarebbe quella di avere due membri privati, un dizionario e un elenco. Per l'inserimento, aggiungi l'elemento alla lista, quindi aggiungi l'indice dell'elemento aggiunto al dizionario con la chiave corrispondente di cui hai bisogno. La ricerca può essere ottenuta utilizzando un valore di Type KeyType (per ottenere l'indice corrispondente dell'elemento) o ottenendo l'elemento dell'elenco utilizzando un offset diretto. Ovviamente non dimenticare di implementare le interfacce applicabili in modo che la tua classe sia compatibile con altre funzionalità .NET.

    
risposta data 13.06.2011 - 04:26
fonte
0

Hmm, programma C # ogni giorno e non posso dire di averne mai avuto bisogno. Se lo facessi, suppongo che sarebbe una cosa semplice da creare: implementa solo IDictionary<,> . Sebbene un dizionario sia un hash, non so cosa significherebbe "ordinare" un hash

Quali sono gli scenari in cui ti troverei ad avere bisogno di un dizionario ordinato?

    
risposta data 13.06.2011 - 04:20
fonte
0

Sembra che C # fornisca entrambi (sebbene uno sia chiamato con un bizzarro nome) quindi vorrei solo commentare perché avere entrambi i tipi è generalmente (non solo in C #, di cui conosco poco) una buona idea.

Ci sono fondamentalmente due modi per implementare una mappa / dizionario. Puoi usare un albero binario bilanciato o puoi usare una tabella hash. Il primo non è ordinato in quanto è possibile scorrere i membri in ordine di chiave, e il secondo no. La capacità di scorrere in ordine è importante in (per esempio) molte applicazioni di elaborazione del testo.

Le mappe ad albero hanno un altro vantaggio: hanno solo bisogno dei tipi in esse per fornire operatori di confronto, dove le cose nelle mappe basate su hash devono fornire una funzione di hash. La maggior parte dei programmatori ha pochi problemi nell'implementazione del confronto, ma una buona funzione di hash può essere molto difficile da implementare.

Sfortunatamente, le mappe ad albero sono generalmente un po 'meno efficienti di quelle con hash. Le mie indagini in C ++ indicano che gli hash sono circa il doppio (il che non è una grande differenza). Ma questo è solo nel caso generale - per esempio, le mappe in cui le chiavi sono stringhe molto lunghe saranno probabilmente implementate in modo più efficiente usando le btrees, poiché la funzione di confronto non deve considerare l'intera stringa, ma la funzione hash lo fa.

Quindi ce l'hai, entrambi i tipi hanno il loro posto nel toolkit di un buon programmatore.

    
risposta data 13.06.2011 - 10:22
fonte

Leggi altre domande sui tag