2

必要なすべてのサブディレクトリが存在するかどうかを確認し、そのためにこのコードスニペットを使用しようとしています:

DirectoryInfo gccdir = new DirectoryInfo(txtgccPath.Text);
List<string> subdirectories = new List<string>();

foreach (var item in gccdir.GetDirectories())
{
   subdirectories.Add(item.Name);
}

if (subdirectories.Contains("bin") &&
    subdirectories.Contains("i686-w64-mingw32") &&
    subdirectories.Contains("include") && 
    subdirectories.Contains("lib") &&
    subdirectories.Contains("libexec") && 
    subdirectories.Contains("share"))
{
  //statements 
}  

これを行うためのより良い方法はありますか?
複数の条件を検証する必要があるこのような状況で、if else ステートメントの過度の使用を避けるための最善の方法は何ですか?

4

4 に答える 4

4

あなたは好きにすることができます

if(new[] {"bin", "include", "lib"}.All(subdirectories.Contains))
{


}

于 2013-07-11T13:10:15.677 に答える
2

逆の方法で行うことができます:

   DirectoryInfo gccdir = new DirectoryInfo(txtgccPath.Text);
    List<string> directorieslist=new List<string>(){"bin", "i686-w64-mingw32","include", "lib","libexec","share"};

    foreach (var item in gccdir.GetDirectories())
    {
        if(directorieslist.Contains(item.Name))
        {
             directorieslist.Remove(item.Name);                         
        } 
    }

    if(directorieslist.Count==0)
    {
       //statement
    }
于 2013-07-11T13:18:33.750 に答える
1

ジョンジーがしたことを基にして、

DirectoryInfo gccdir = new DirectoryInfo(txtgccPath.Text);
var subdirectories= gccdir.GetDirectories();
var dirsToCheckFor = new[] { "bin", "include", "lib", "libexec", "share", "i686-w64-mingw32" };

if(subdirectories.All(dir => dirsToCheckFor.Contains(dir.Name)))
{
    //gccdir contains all folders in dirsToCheckFor
}

唯一の違いは、フォルダー内のディレクトリの文字列のリストを作成する必要がないことです。

于 2013-07-11T13:33:48.487 に答える
1
string[] subs = new string[] {
    "bin",
    "i686-w64-mingw32",
    "include"
    };

IEnumerable<string> exists = subdirectories.Join(subs, 
    sd1 => sd1, 
    sd2 => sd2, 
    (sd1, sd2) => sd1).ToArray();

if (subs.Length == exists.Length)
{
// contains all
}
于 2013-07-11T13:13:27.557 に答える