2017-04-05 39 views
1

關於我的代碼的一些背景知識,我基本上有一個記錄類,它有很多屬性來捕獲以.txt文件形式提供的所需數據,並且每列都分爲它們自己的單獨文件,即Month.txt,Day .txt,每行包含600行數據。有沒有更好的方法來初始化記錄數組,使其更加動態? C#

現在,我有第二個數組,基本上是上述類的集合,我給它的最大值600(因爲有600個數據)。這個類擁有一個初始化方法。

這樣它初始化我的記錄每一列的時間,但我必須知道行的固定大小不運行到索引超出範圍的異常。另外,我有很多屬性,所以整個「if else」語句使得這段代碼看起來非常冗餘且很難看清楚。靈活性也是一個問題,因爲該點重置爲0,所以當我想添加額外的數據時,我將僅僅覆蓋原來的600.

有沒有辦法改進?

回答

1

該代碼並不理想,因爲它會檢查該文件中每行的文件名。最好決定在循環之前設置哪個字段,然後在整個循環中使用該決定。

首先,基於文件的前綴制定者的查找表:

var setters = new Dictionary<string,Action<Record,string>> { 
    ["Day"] = (r,v) => r.Day = v 
, ["Month"] = (r,v) => r.Month = v 
, ... 
}; 

有了這個查詢,閱讀代碼變得簡單明瞭:

using (StreamReader R = new StreamReader(file.FullName)) { 
    var pos = File.Name.IndexOf("_"); 
    Action<Record,string> fieldSetter; 
    if (pos < 0 || !setters.TryGetValue(File.Name.Substring(0, pos), out fieldSetter)) { 
     continue; // Go to next file 
    } 
    string temp; 
    while((temp = R.ReadLine()) != null) { 
     fieldSetter(records[pointer++], temp); 
    } 
} 

首先,我們使用文件名稱前面的第一個下劃線字符'_'來查找setter。然後我們檢查文件中的行,併爲每個記錄傳遞我們得到的字符串調用setter。

添加新字段也變得很簡單,因爲您只需將一個新行添加到setters初始值設定項。

+1

我剛剛瞭解了lambda表達式和委託,因爲你;謝謝。 – Vocaloidas

相關問題