【问题标题】:Are there problems if I have a verbose datatype?如果我有详细的数据类型,会有问题吗?
【发布时间】:2012-07-28 11:30:20
【问题描述】:

在我的应用程序开发中,我得出的结论是我需要这个变量。

IDictionary<string, IDictionary<Levels, IList<Problem>>> PackageDictionaryForProblems
IDictionary<string, IDictionary<Levels, IList<ProblemRule>>> PackageDictionaryForProblemRules

但是由于我需要访问字典的每个键,所以这很痛苦。我认为创建一个类以避免写入所有数据类型是一个不错的选择:

public class PackageDictionaryForProblems : IDictionary<string, IDictionary<Levels, IList<Problem>>>
{ }

// the sane for the second dictionary

您对此有何看法?只创建这个类是一个好习惯吗?还是我需要为每个类创建几个类?即。

public class ProblemCollection : IList<Problem>
{ }

【问题讨论】:

  • 你的代码不会编译,因为你没有实现IDictionary。您的意思是像class PackageDictionaryForProblems : Dictionary&lt;string, IDictionary&lt;Levels, IList&lt;Problem&gt;&gt;&gt; 之类的东西(也就是说,继承自Dictionary,而不是IDictionary)?
  • 是的,你是。我忘记了这一点!

标签: c# oop list dictionary


【解决方案1】:

就我个人而言,我认为没有理由仅仅为某些现有功能添加别名而创建类。

【讨论】:

    【解决方案2】:

    定义多级集合的两个选项在runtype上没有区别

    IDictionary<string, IDictionary<Levels, IList<Problem>>> PackageDictionaryForProblems
    

    或定义/使用类似的类型

    public class PackageDictionaryForProblems : IDictionary<string, IDictionary<Levels,     IList<Problem>>>
    { }
    

    PackageDictionaryForProblems 中没有任何其他功能,它只是作为IDictionary&lt;string, IDictionary&lt;Levels, IList&lt;Problem&gt;&gt;&gt; 的别名。

    您仍然会得到相同的内存分配、访问时间等。添加自定义类型只会简化代码的可读性(或者不会……我个人觉得查看 IDictionary&lt;string, IDictionary&lt;Levels, IList&lt;Problem&gt;&gt;&gt; 定义更容易理解数据结构。这只是个人喜好)。

    【讨论】:

      【解决方案3】:

      只创建这个类是个好习惯吗?

      使用自定义类的主要优点是,尤其是在这种情况下,它可以让您简化访问。

      嵌套字典访问通常可以通过添加更高级别的成员函数来简化,因为“单一访问”通常需要检查可以添加新字典等的包装字典。将其包装到一个简单的 API 可以显着简化类型。

      但是,如果您只是直接公开底层类型,那么创建此类与仅使用内置类型相比几乎没有优势。

      【讨论】:

        【解决方案4】:

        我使用额外类的三个原因:

        1. 可读性。
        2. 轻松添加额外的方法和属性以及覆盖
        3. 轻松更改类型(只需替换基本类型,而不是在我的代码中寻找实例化对象的类型。

        【讨论】:

        • 4. (在Dictionary&lt;&gt; 的情况下)您总是需要使用不区分大小写的比较器来构造这些,有时会忘记。额外的类可以使用该比较器调用基本构造函数。
        【解决方案5】:

        我倾向于避免将泛型类型嵌套超过一层,除非类型是原始类型(例如stringint)。我可能会重构,以便您拥有一个从 Levels 映射到 Ts 的通用类:

        class LevelMapping<T> {
          IDictionary<Level, T> Mapping {get; set;}
        
          // constructors/methods etc
        }
        

        现在您可以拥有stringLevelMappings 的IDictionary

        IDictionary<string, LevelMapping<Problem>> PackageDictionaryForProblems;
        IDictionary<string, LevelMapping<ProblemRule>> PackageDictionaryForProblemRules;
        

        这当然取决于您在此处映射的具体内容。可能更适合用特殊方法包装整个字典以更好地反映您的域(或者根本不包装它!)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 2018-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多