Mi hanno una struttura che può essere facilmente rappresentato utilizzando un dizionario nidificato tre profondo, in questo modoUn dizionario annidato in profondità è un antipattern?
private static Dictionary<string, Dictionary<string, Dictionary<string,string>>> PrerenderedTemplates;
Qualora la struttura potrebbe essere usato qualcosa di simile
PrerenderedTemplates[instanceID][templategroup][templatepart]
Ora, mi rendo conto che questo codice è difficile da leggere, perché guardando la definizione di definizione, non si può dire per cosa viene usato. L'unico vantaggio che posso davvero vedere nel modificarlo in Dictionary<string, PrerenderedTemplate>
è la leggibilità. La conversione di ogni nidificazione in una propria classe (ad esempio class PrerenderedTemplate{} class TemplateGroup{} class TemplatePart{}
) aggiungerebbe molte più righe di codice per un vantaggio computazionale piccolo (se non nullo). Per quanto posso vedere.
- Quindi, è il mio approccio "ok" o dovrei fare il miglio supplementare e creare classi separate?
- Va bene illustrare come funziona il nidificato
Dictionary
nella documentazione/commenti - Esiste una procedura ottimale per gestire questo tipo di nidificazione?
- Tenete a mente, questo è un membro privato, non deve essere semplice per le persone che usano la classe.
Aggiornamento
Così, ispirato da Reza, ma in grado di utilizzare tuple, ho deciso di creare il mio generatore di chiavi e mettere in atto il suo modello come questo:
private Dictionary<string, string> PrerenderedTemplates;
private string GetPrerenderedTemplateKey(string InstanceId, string FeatureId, string OptionId)
{
return new StringBuilder(instanceId)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templategroup)
.Append(FormatTools.LIST_ENTRY_DELIMITER)
.Append(templatepart).ToString();
}
Dove FormatTools.LIST_ENTRY_DELIMITER
è il carattere di uso privato Unicode 0xe04d
.
Poiché i primi due raggruppamenti sono essenzialmente solo identificatori, forse potrei farla franca con un semplice dizionario. Quindi 'PrerenderedTemplates [" instance1 "] [" fruit "] [" banana "]' potrebbe essere semplicemente rappresentato come 'PrerenderedTemplates [" instance1_fruit_banana "]', come un namespace. –
Hai bisogno della possibilità di usare 'Modelli prerenderati 'per elencare i gruppi di modelli o le parti del modello? Una specie di "PrerenderedTemplates [instanceID] .Keys" o "PrerenderedTemplates [instanceID] [templateGroup]'? Se è così, questo è probabilmente il modo più semplice per gestirlo. –
@ M.Babcock, beh, sto collegando un insieme di oggetti che contengono metadati che puntano a come eseguire il rendering di un modello. Prima di mostrare quel modello, voglio controllare il mio dizionario per assicurarmi che non sia già stato sottoposto a rendering. In caso contrario, eseguo il rendering e aggiungo il risultato al mio dizionario. (La modifica del modello è gestita altrove) –