2011-12-10 11 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 
     } 
    } 

フォルダー名のリストは変更されない可能性があります。

私の質問は、フォルダのリストを処理する最良の方法は何ですか?文字列の配列は明らかに最適ではありません。この「リスト」は、

のエラーを作るのは簡単かもしれないように思えるように私は、列挙型を使用して考えていたが、他の提案を歓迎するかの

申し訳ありませんが(項目名はところでのみ3文字は通常あり) )

編集:orginallyは名前のリストが変更される可能性は低いと言いましたが、これはリストが追加される可能性が低いため非常にひどく述べられています。

+0

は生成可能なフォルダ名ですか? –

+4

既存のコードに問題はありますか? – Snowbear

+2

あなたが実際にここで何を求めているか分かりません。 –

答えて

1

このようなシナリオに遭遇したとき、私はそれらをファイル(XMLまたはテキスト)に書き込む方が好きです。また、フォルダ名が変更されたり、新しいフォルダ名が導入される必要がある場合は、コードを更新する必要がないという利点があります。あなたは、これらの2つのケースのいずれも起こりそうにないので、利益は幾分失われていると言いました。このオプションは、リスト内の読み込みに関わる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 
    } 
} 

注:あなたの元のコードでは、あなたが名前を取得するためにi代わりのlist[i]を使用していたが。また、ループの長さを決定するには、5の代わりにlist.Lengthを使用する必要があります。

+0

あなたは私がちょうど言っていることを言った:1)配列に本質的に間違ったものは何もない - それらは完全に適切かもしれない、2) >または辞書<>)。 3) "foreach(type)"は "for(int i)"の素晴らしい代替手段です。私が追加する1つのことは、 "文字列"を使用して文字列データを操作することで、 "テキスト"を使用することがずっと効率的になるということです。 – paulsm4

+0

リストは最適ではありませんが、リストが変更される可能性は低いのですが、常にそうなる可能性があります。もしそうであれば、コードを変更する必要があります。明らかに、私はそれを除外するのではなく、問題の中でこれを指摘しておきました。 – crunchy

+0

@ user1091479:プログラムの実行中にリストが変更されますか?それ以外の場合は、配列を使用しない理由はありません。たとえば、ファイルから名前を読み取る場合、 'File.ReadAllLines'メソッドは文字配列を返します。 – Guffa

0

アレイは半ダイナミックなものです。デザイン時にサイズを知る必要はありませんが、作成後にサイズを変更することはできません。ただし、Listは動的に拡張され、.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; 
    } 
} 

EDIT: 注意コード例が正確であるかどうかはわかりません。 listにテストするディレクトリ名が含まれていると仮定すると、ディレクトリ名は
string.Format("c:\\{0}", list[i])となります。