2014-03-25 169 views
1

我有一個使用EPPlus從電子表格中讀入文本的類。它的工作原理與我想要的完全相同,但我覺得我做這件事的方式是不好的做法,但對於我的生活,我無法找出一個不太硬編碼並且使用較少if語句的替代方案。 該類包含常量如If語句太多?

private static string configUserName; 
private static string configPassword; 
private static string configUrl; 
private static string configDatabase; 
//etc 

約有40個這些。類通過電子數據表中循環讀取所有的值檢查該值時,是這樣的:

int i = 1; 
object isRow = currentWorksheet.Cells[i, 1].Value; 
while (isRow != null) 
{ 
if (isRow.ToString().Trim().Equals("change_bank_details_policy")) 
    { 
     if (currentWorksheet.Cells[i, 2].Value != null) 
     { 
     change_bank_details_policy =c currentWorksheet.Cells[i,2].Value.ToString().Trim(); 
     } 
    } 
else if //etc 40 more if statements 

然後因爲值是私募有40種方法,如

public static string GetConfigUserName() 
    { 
     return configUserName; 
    } 

必須有一個更好的辦法去做這個? 電子表格看起來像

change_bank_details_policy,11459676 
change_DD_date_policy,11441975 
[40 more rows....] 
+0

通過使用switch語句,可以使它變得更清潔。 – IllusiveBrian

+1

你有沒有想過使用地圖字符串 - >函數? –

+0

@MikeStrobel那裏有對「change_bank_details_policy」 – Ben

回答

4

你能製作一個Dictionary(帶有密鑰String,值Int),它將字符串和值映射在一起嗎?

閱讀Excel工作表中一行的時間,建立自己的詞典。
然後使用字典來設置適當的變量。

然後之後你的詞典是這樣的:

 KEY      VALUE 
============================|======== 
change_bank_details_policy |11459676 
change_DD_date_policy  |11441975 

和字典建成後,你可以簡單地做:

change_bank_details_policy = my_dictionary["change_bank_details_policy"]; 

我覺得外形看起來像:

Dictionary<String, UInt32> myDict = new Dictionary<String, UInt32>(); 

object isRow = currentWorksheet.Cells[i, 1].Value; 
while (isRow != null) 
{ 
    myDict.Add(isRow.ToString().Trim(), currentWorksheet.Cells[i,2].Value); 
    // Go get the next Row.... details are up to you. 
} 

change_bank_details_policy = myDict["change_bank_details_policy"]; // Look up this key in the dictionary to get this integer.... 
change_DD_date_policy  = myDict["change_DD_date_policy"]; 
// [... repeat 40 more times ... but no If statements ] 
+0

我甚至會選擇直接從字典中獲取正確的值,以進一步簡化兩個密碼以及如何訪問它的自定義屬性其他公共字符串。 – Flater

+0

這將是除了事實,我需要有一個外部絕對完美的excel文件,因爲該值即那些政策號碼將有所改變,需要由應用程序的用戶進行更改。 – Ben

+0

我在說,從外部Excel文件讀入內部字典(應該很簡單),然後使用內部字典進行簡單的查找,而不需要大量的If語句。 – abelenky

2

問題的根本原因是,你有〜40級的變量,這是一個明確的code smell。您應該考慮使用Dictionary來存儲它們 - 而不是廣泛使用變量。

Dictionary是從「鑰匙」的「價值」的映射。在你的情況下,它將從一個字符串映射到一個字符串(如果你實際需要一個字符串)。

0

開關statem經濟需求已經提到,但在C#一個漂亮的特點是,你可以設置爲只讀,所以要回答你的第二個問題,您的變量可能有以下語法一個變量直接訪問:

private static string configUserName 
{ 
    public get; 
    private set; 
} 

這將使你的類成員直接訪問變量,但會導致編譯器錯誤,如果用戶試圖直接寫入到它(但如果他們試圖讀取它),因此,例如:

instance.configUserName = "Bob"; 

將在課堂上工作 - 會員代碼,但不會在用戶代碼中編譯,而:

String bob = instance.configUserName; 

會在兩處編譯。

+0

你忘記了它不會縮短代碼。您需要兩件獨立的事情:一個用於存儲數據的變量,另一個用於定義如何訪問數據。在你的代碼示例,您使用的是同一個名稱,這將不能編譯(或不斷循環,應該把它編譯) – Flater

+0

這是有趣的,但我不認爲它回答我的問題的核心是當值的定義。 – Ben

0

下面的代碼不會覆蓋未讀值。如果源文件中沒有行,則以前的值不會丟失。我認爲這對源文件內容來說更加防彈一點。

var dict = new Dictionary<string, Action<long>>(); 
dict.Add("change_bank_details_policy", v => change_bank_details_policy = v); 
// 40 of these, no choice 

int i = 1; 
object isRow = currentWorksheet.Cells[i, 1].Value; 
while (isRow != null) 
{ 
    string rowTitle = isRow.ToString().Trim(); 
    if (dict.ContainsKey(rowTitle)) 
    { 
     // Or parse it or whatever you have to do to handle the cell value type 
     long rowValue = currentWorksheet.Cells[i,2].Value; 
     dict[rowtitle](rowValue); 
    } 

    isRow = currentWorksheet.Cells[++i, 1].Value; 
}