Dot-Net

.NET:字元串鍵的切換與字典

  • February 17, 2017

我有一個業務對象,其中包含大約 15 個不同類型的屬性。業務對像還必須實現具有以下方法的介面:

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 語句或字典同步。

因為您使用的是字元串 Dictionary 可能會更快。使用字元串時,Switch 本質上會被轉換為雜湊表。但是,如果您使用的是整數或類似的東西,它會被轉換為跳轉表並且會更快。

有關更多詳細資訊,請參閱此答案和問題

最好的辦法是對其進行分析並確定

引用自:https://stackoverflow.com/questions/1334087