.NET:用于字符串键的切换与字典

Vil*_*lx- 11 .net dictionary switch-statement

我有一种情况,我有一个业务对象,有大约15种不同类型的属性.业务对象还必须实现具有以下方法的接口:

object GetFieldValue(string FieldName);
Run Code Online (Sandbox Code Playgroud)

我可以看到实现此方法的两种方法:

使用switch语句:

switch ( FieldName )
{
    case "Field1": return this.Field1;
    case "Field2": return this.Field2;
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

使用字典(SortedDictionary或HashTable?):

return this.AllFields[FieldName];
Run Code Online (Sandbox Code Playgroud)

哪个会更有效率?

补充:忘了说.此方法用于在网格中显示项目.网格将为每个属性都有一列.通常会有超过1000个项目的网格.这就是为什么我关注性能.

新增2:

这是一个想法:混合方法.创建一个静态字典,其中键是属性名称,值是数组中的索引.在应用程序启动时,字典仅填充一次.每个对象实例都有一个数组.所以,查找将是:

return this.ValueArray[StaticDictionary[FieldName]];
Run Code Online (Sandbox Code Playgroud)

字典填充算法可以使用反射.然后将相应地实现属性本身:

public bool Field1
{
    get
    {
        object o = this.ValueArray[StaticDictionary["Field1"]]; 
        return o == null ? false : (bool)o;
    }
    set
    {
        this.ValueArray[StaticDictionary["Field1"]] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到这个问题吗?

它也可以更进一步,ValueArray/StaticDictionary可以放在一个单独的泛型类型中ValueCollection<T>,其中T将指定反射的类型.ValueCollection还将处理尚未设置任何值的情况.然后可以将属性简单地写为:

public bool Field1
{
    get
    {
        return (bool)this.Values["Field1"];
    }
    set
    {
        this.Values["Field1"] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我开始怀疑,如果一个简单的switch语句可能不会更快更容易维护....

Ash*_*Ash 21

switch:      good efficiency, least maintainable
dictionary:  good efficiency, better maintainability
reflection:  least efficient, best maintainability
Run Code Online (Sandbox Code Playgroud)

提示:忽略效率并仅担心可维护性,除非您实际测试了性能并发现它是一个问题.

我不是说反射是你唯一的选择,只是它允许你根据需要添加/删除和重命名属性,而不需要保持switch语句或字典同步.

  • 我倾向于发现反射的认知开销使得它比dispatch-table Dictionary方法更难维护.虽然这可能只是因为我不经常使用反射.:) (7认同)
  • 字典比switch语句更有效?我没想到,你能详细说明吗? (3认同)
  • 反思是魔鬼 (3认同)
  • @Rune,我可以向你保证字典比使用反射更快.计算机科学中的哈希表和字典存在是因为它们可以提供比大多数其他数据结构更高的数据检索性能.而存在反射以在运行时提供类型的可发现性,而不是出于性能原因.但是不要相信我的话,尝试比较作为实验. (2认同)

Mik*_*Two 7

因为你使用字符串字典可能会更快.在使用字符串时,Switch基本上会转换为哈希表.但是如果你使用整数或类似的东西,它会被转换为跳转表并且会更快.

有关详细信息,请参阅此答案和问题

最好的办法是对其进行剖析并确定