This morning I decided to write this question: https://stackoverflow.com/questions/11727571/are-there-problems-if-i-have-a-verbose-datatype/11727723#11727723I don't really explain my scenario about how am I accesing through the nested dictionaries. I decided to have the default alias (IDictionary<string, IDictionary<Levels, IList<Problem>>>) but I'm thinking that's not a good option right now.I'm gonna show some parts of my code:ProblemBaseFactorypublic abstract class ProblemBaseFactory : IProblemFactory{    private IDictionary<string, IDictionary<Levels, IList<Problem>>> problemDictionaryPackages;    protected ProblemBaseFactory()    {        problemDictionaryPackages = new Dictionary<string, IDictionary<Levels, IList<Problem>>>();    }    protected IDictionary<string, IDictionary<Levels, IList<Problem>>> ProblemDictionaryPackages    {        get { return problemDictionaryPackages; }    }    public abstract IEnumerable<Levels> AvailableLevels(string packageName);    public abstract IEnumerable<Problem> LoadProblems(ProblemFactoryProperties properties);}RuleProblemFactorypublic abstract class RuleProblemFactory : ProblemBaseFactory{    private IDictionary<string, IDictionary<Levels, IList<ProblemRule>>> ruleDictionaryPackages;    private IRuleAlgorithmSelector ruleAlgorithmSelector;    private IList<Problem> temp;    protected RuleProblemFactory()        : this(new Dictionary<string, IDictionary<Levels, IList<ProblemRule>>>(), new SequentialRuleSelector())    {    }    protected RuleProblemFactory(IRuleAlgorithmSelector ruleAlgorithmSelector)        : this(new Dictionary<string, IDictionary<Levels, IList<ProblemRule>>>(), ruleAlgorithmSelector)    {    }    protected RuleProblemFactory(IDictionary<string, IDictionary<Levels, IList<ProblemRule>>> ruleDictionary,        IRuleAlgorithmSelector ruleAlgorithmSelector)    {        this.ruleDictionaryPackages = ruleDictionary;        this.ruleAlgorithmSelector = ruleAlgorithmSelector;        LoadBankOfRules();    }    protected IDictionary<string, IDictionary<Levels, IList<ProblemRule>>> RuleDictionaryPackages    {        get { return ruleDictionaryPackages; }    }    public override IEnumerable<Problem> LoadProblems(ProblemFactoryProperties properties)    {        // does exist the package name?        if (!ProblemDictionaryPackages.ContainsKey(properties.NamePackage))            throw new InvalidOperationException(namePackage);        IDictionary<Levels, IList<Problem>> problemPackage = this.ProblemDictionaryPackages[properties.NamePackage];        // does exist the list        if (!problemPackage.ContainsKey(properties.Difficulty))            problemPackage.Add(properties.Difficulty, new List<Problem>());        temp = problemPackage[properties.Difficulty];        if (temp.Count >= properties.Quantity)            return temp;        else            return GenerateProblems(properties);    }    private IEnumerable<Problem> GenerateProblems(ProblemFactoryProperties properties)    {        ruleAlgorithmSelector.Rules = ruleDictionaryPackages[properties.NamePackage][properties.Difficulty];        ...    }    public override IEnumerable<Levels> AvailableLevels(string name)    {        return ruleDictionaryPackages[name].Keys;    }}Sometimes I guess is difficult to readability. What do you recomend me to to mantain a better readability?
How to refactor a verbose datatype?
c#;algorithm;object oriented