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

标签 .net dictionary switch-statement

我有一个业务对象,其中包含大约 15 个不同类型的属性。业务对象还必须实现具有以下方法的接口(interface):

object GetFieldValue(string FieldName);

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

使用 switch 语句:
switch ( FieldName )
{
    case "Field1": return this.Field1;
    case "Field2": return this.Field2;
    // etc.
}

使用字典(SortedDictionary 还是 HashTable?):
return this.AllFields[FieldName];

哪个效率更高?

补充:忘了说。此方法用于在网格中显示项目。网格将为这些属性中的每一个提供一列。通常会有超过 1000 个项目的网格。这就是我关心性能的原因。

新增2:

这是一个想法:混合方法。制作一个静态字典,其中键是属性名称,值是数组中的索引。字典仅在应用程序启动时填写一次。每个对象实例都有一个数组。因此,查找将如下所示:
return this.ValueArray[StaticDictionary[FieldName]];

字典填充算法可以使用反射。然后将相应地实现属性本身:
public bool Field1
{
    get
    {
        object o = this.ValueArray[StaticDictionary["Field1"]]; 
        return o == null ? false : (bool)o;
    }
    set
    {
        this.ValueArray[StaticDictionary["Field1"]] = value;
    }
}

任何人都可以看到这有什么问题吗?

还可以更进一步,ValueArray/StaticDictionary 可以放在单独的泛型类型ValueCollection<T> 中。 , 其中 T将指定反射的类型。 ValueCollection 也将处理尚未设置值的情况。然后属性可以简单地写成:
public bool Field1
{
    get
    {
        return (bool)this.Values["Field1"];
    }
    set
    {
        this.Values["Field1"] = value;
    }
}

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

最佳答案

switch:      good efficiency, least maintainable
dictionary:  good efficiency, better maintainability
reflection:  least efficient, best maintainability

提示:忽略效率并只担心可维护性,除非您实际测试过性能并发现这是一个问题。

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

关于.NET:字符串键的切换与字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1334087/

相关文章:

javascript - 如何在网页上的谷歌地图上添加地址?

c# - 什么时候应该使用 LINQ for C#?

arrays - 如何从 Swift 中的 txt 文件创建字典数组?

在 C 中的 case/switch 语句中,无法重新启动到有限状态机中的初始情况

c# - gzipstream.copyto .net 3.5 中的替代且简单的方法

c++ - 如何在三元组运算符的帮助下按最大值完成映射

python - 随机播放python中的字典值

c - C 中是否存在标记或未标记的中断?

c# - 如何在组合框中使用 case 作为字符串来执行 switch 语句?

c# - 有人用.NET编写桌面应用程序吗?