2011-12-10 31 views
0

我必須重寫一些舊的代碼,我想知道處理一長串字符串的最佳方法。該列表包含大約100個項目,每個項目用於匹配可能包含多個文件的文件夾,這些文件將被添加到將被命名爲「[parentfolder] .zip」的zip歸檔文件中。處理字符串列表的最佳做法

當前代碼的外觀這樣的事情:

string[5] list = {"a", "b", "c", "d", "e"}; 

    for (int i = 0; i < 5; i++){ 
     // open folder for list[i] 
     if (Directory.Exists(string.Format("c:\\{0}", i))){ 
      // get files and add them to list[i].zip 

      // do some work with archive 
     } 
    } 

文件夾名稱列表不太可能改變,但它有一個小的可能性。

我的問題是什麼將是處理文件夾列表的最佳方式?一串字符串顯然不是最優的。我想用一個枚舉的,但歡迎任何其他建議,這個「清單」似乎是它可以很容易使

錯誤(項目名稱通常是BTW只有三個字母)

很抱歉,如果這似乎是一個愚蠢的問題;)

編輯:最初指出,名單的名單不太可能改變,這是非常糟糕的陳述,因爲有一個小的機會,名單將被添加到。

+0

是可生成文件夾名稱的目錄名稱: –

+4

你對現有的代碼有任何問題嗎? – Snowbear

+2

不確定你在這裏問的是什麼。 –

回答

1

當我遇到這樣的場景時,我傾向於將它們寫入文件(xml或文本)。這還增加了如果文件夾名稱改變或者需要引入新的代碼就不必更新代碼的優點。你提到這兩種情況都不可能發生,所以這種好處有些丟失。這個選項比較慢,因爲在列表中讀取IO操作,所以如果你不需要我提到的好處,那麼它可能不是一個好方向。

最後,如果您無法看到正在更改或正在添加的項目,則列表或數組確實是最合適的。

+0

該列表不太可能改變,這是真的,但總是有改變的機會。 – crunchy

+0

@ user1091479,儘管列表可能不會(可以想象)發生變化,但總會有拼寫錯誤的機會:)現在,您可以重新編譯並重新部署每次,或者只更新一個xml /文本文件。 :) –

1

Enum無法正常工作,因爲您不能在C#中使用基於字符串的枚舉。

這樣一個枚舉最接近的是一堆公共常量。

這兩個選項都不是很好,因爲你不能列舉他們。

數組選項並不差 - 不知道你的反對意見是什麼。有沒有必要卻使用for循環 - 你可以這樣做:

string[5] list = {"a", "b", "c", "d", "e"}; 

foreach(string dirName in list){ 
    // open folder for list[i] 
    if (Directory.Exists(string.Format("c:\\{0}", i))){ 
     // get files and add them to list[i].zip 

     // do some work with archive 
    } 
} 
0

我實在看不出有什麼問題,使用數組。爲什麼「顯然不是最優」?

枚舉在這裏似乎不夠。當你需要對某些東西進行分類時,通常會使用它們,而不是保存描述某些具體項目(如文件夾名稱)的列表。此外,您不能直接使用枚舉值,您需要先將它們轉換爲字符串。

2

你爲什麼認爲一串字符串不是最優的?

該陣列是最簡單的收集形式,用於大多數收集的內部存儲,如List<T>Dictionary<T>。作爲一個數組涵蓋您的需求,這應該是明顯的選擇。

您可以使用一個枚舉來循環數組,這使得代碼位清潔:

string[] list = {"a", "b", "c", "d", "e"}; 

foreach (string name in list) { 
    // open folder for list[i] 
    if (Directory.Exists(string.Format("c:\\{0}", name))){ 
     // get files and add them to list[i].zip 

     // do some work with archive 
    } 
} 

注:在你原來的代碼你正在使用的不是ilist[i]得到的名稱。此外,您應該使用list.Length而不是5來確定循環的長度。

+0

你說了我剛剛說的話:1)數組沒有什麼天生的錯誤 - 它們可以完全合適,2)有其他容器類型(例如List < >或Dictionary <>)。和3)「foreach(type)」是「for(int i)」的一個很好的選擇。我還要補充的一件事是使用「文本」可以更多,更高效地使用「字符串」操作字符串數據。 – paulsm4

+0

該數組並不是最優的,因爲雖然列表不可能發生變化,但總會有一些可能性,如果發生變化,我將不得不更改代碼。顯然,我應該在問題中指出這一點,而不是像我那樣排除它。 – crunchy

+0

@ user1091479:在運行程序時列表是否會發生變化?否則沒有理由不使用數組。例如,如果您從文件中讀取名稱,則'File.ReadAllLines'方法返回一個字符串數組。 – Guffa

0

一個數組是一種半動態的。您不必在設計時就知道它的尺寸,但是在創建它之後無法更改其尺寸。然而,列表可以動態增長並在.NET Framework中廣泛使用。我在使用列表中看不到任何問題。枚舉是完全不同的東西。它們代表一組命名常量。

List<string> directories = new List<string>(); 
int i = 0; 
while (true) { 
    string dir = string.Format("c:\\{0}", i++); 
    if (Directory.Exists(dir)) { 
     directories.Add(dir); 
    } else { 
     break; 
    } 
} 

編輯: 注意我不確定,如果您的代碼示例是準確的。如果list應該包含要測試的目錄名稱,那麼您將不得不使用
string.Format("c:\\{0}", list[i])