2009-11-02 64 views
0

我正在讀取一個CSV文件,我想將結果緩存在一個數組中。陣列性能/優化

這是我的getter/setter:

private RedirectionRule[] RedirectionRules 
{ 
    get 
    { 
     if (_redirectionRules == null) 
     { 
      return new RedirectionRule[MAXLENGTH]; 
     } 

     return _redirectionRules; 
    } 
    set 
    { 
     _redirectionRules = value; 
    } 
} 

這是緩存結果的最佳方式是正確的做法?

回答

1

我不認爲在返回一個新的陣列在你的吸氣時,是null太多了。如果您在解析CSV的代碼中設置屬性,則會將其緩存起來。


換句話說,地方你應該有這樣的函數解析CSV數據(作爲一個例子,我已經把它放在RedirectionRule類,但你可以有一個RedirectionRuleParser類或類似的東西根據您的需要):

class RedirectionRule { 
    public static RedirectionRule Parse(string text) { 
     // some code here to parse text for your RedirectionRule object 
    } 

    public static RedirectionRule[] ParseCsv(string csv) { 
     string[] values = csv.Split(','); 
     RedirectionRule[] rules = new RedirectionRule[values.Length]; 

     for (int i = 0; i < values.Length; i++) { 
      rules[i] = RedirectionRule.Parse(values[i]); 
     } 
    } 
} 

然後,如果你有這樣的地方的代碼,你緩存中的數據:

string csv = "RuleType1,RuleType1,RuleType1"; 
RedirectionRules = RedirectionRule.ParseCsv(csv); 

在其他地方,你要訪問您的緩存中的數據:

if (RedirectionRules != null) { 
    // do something with your cached data 
} else { 
    // I don't know, throw an exception or something 
} 

您的示例代碼將創建你的財產的getter新RedirectionRule[MAXLENGTH]陣列實現的唯一的事就是潛行過去的RedirectionRules != null檢查以上,從而開放訪問數據的可能性,看起來像它已被緩存但實際上是空出來的

0

很難說一般情況下,這取決於你需要什麼。

又一個想法:當你在getter中創建一個完整大小的數組時,爲什麼你需要一個setter?應該只有一個的地方創建數組,只是爲了保持乾淨。

然後 - 當你創建數組一次,這肯定,爲什麼不在構造函數中創建它?

1

我不知道我理解的問題真的,因爲我不知道它的以下幾個問題你問

  1. 是否有任何的優化可以將顯示代碼?
  2. 數組是緩存結果的最佳容器嗎?
  3. 將csv加載到此容器中的最佳方式是什麼?

也許你問的所有3個,所以我會盡我所能回答的所有3

  1. 這是不是最佳的吸每次檢查空。我建議你在構造函數中初始化它。
  2. 是的,陣列聽起來不錯
  3. 我想你將不得不提供更多的信息才能完全回答這個問題。 String.Split會將你的csv轉換成一個字符串[],這正是我通常所做的。