构造静态查找

时间:2017-07-05 15:50:25

标签: c# .net lookup

假设我有一个巨大的定义列表,用于查找对象可以默认为“类型编号”的值。此类型编号是唯一的,并指向使用它初始化对象时将设置的数据。

我通常的选择是拥有一个静态属性,每次获取都会返回一个新的Dictionary。 E.g。

public static Dictionary<long, Tuple<string,DefaultValue>> Defaults
{
   get { return new Dictionary<long, DefaultValue>() 
         {
            { 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
            { 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
            ... 
         }
   }
}

这样做,并且查找列表可能永远不会大到足以显着影响性能或内存使用,但是对性能有点吝啬我不喜欢每个实例化一个新Dictionary的想法它被引用的时间。我宁愿它完全硬编码到内存中。

如何以专业的方式解决这个问题?我觉得我上面这样做的方式令人难以置信的草率。

2 个答案:

答案 0 :(得分:4)

您可以使用自动属性初始值设定项或在静态构造函数中设置值。后者如下所示。

static MyClass()
{
   Defaults = new Dictionary<long, DefaultValue>(){
        { 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
        { 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
      };
}

public static Dictionary<long, DefaultValue> Defaults {get; private set;}

使用自动属性初始化程序的示例(不需要静态构造函数,并且省略了私有集,因为现在可以假设您正在使用支持该的c#版本。)

public static Dictionary<long, DefaultValue> Defaults {get;} = new Dictionary<long, DefaultValue>(){
        { 123, new DefaultValue("Name of default 1", 12312, 23544, ...)},
        { 456, new DefaultValue("Name of default 2", 36734, 74367, ...)},
      };

旁注:如果不应更改这些值,您还可以在属性上公开IReadonlyDictionary界面。

答案 1 :(得分:0)

如果查找表很小并且您的目标是提高查找操作的性能,那么您还可以考虑使用带有switch语句而不是查找字典的函数。

有关详细信息,请参阅此答案:https://stackoverflow.com/a/11617459/1709981