2014-07-23 37 views
0

到目前爲止,我有以下幾點:簡化的邏輯,以避免重複錯誤信息

// Gets all the drives 
DriveInfo[] allDrives = DriveInfo.GetDrives(); 

// checks if any CD-Rom exists in the drives 
var cdRomExists = allDrives.Any(x => x.DriveType == DriveType.CDRom); 

// Get all the cd roms 
var cdRoms = allDrives.Where(x=>x.DriveType==DriveType.CDRom); 

if (cdRomExists.Equals(true)) 
{ 
    // Loop through the cd roms collection 
    foreach(var cdRom in cdRoms) 
    { 
     Console.WriteLine("Drive {0}", cdRom.Name); 
     Console.WriteLine(" File type: {0}", cdRom.DriveType); 

     if (cdRom.IsReady == true) 
     { 
      if (cdRom.DriveType == DriveType.CDRom) 
      { 
       DirectoryInfo di = new DirectoryInfo(cdRom.RootDirectory.Name); 

       var file = di.GetFiles("*.csv", SearchOption.AllDirectories).FirstOrDefault(); 

       if (file == null) 
       { 
        errorwindow.Message = LanguageResources.Resource.File_Not_Found; 
        dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
       } 
       else 
       { 
        foreach (FileInfo info in di.GetFiles("*.csv", SearchOption.AllDirectories)) 
        { 
         Debug.Print(info.FullName); 
         ImportCSV(info.FullName); 
         break;  // only looking for the first one 
        } 
       } 
      } 
     } 
     else if (cdRom.IsReady == false) 
     { 
      errorwindow.Message = LanguageResources.Resource.CDRom_Not_Ready; 
      dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow);    
     } 
    } 
} 
else 
{ 
    errorwindow.Message = LanguageResources.Resource.CDRom_Error; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
} 

有以下的問題,錯誤消息連續彈出兩次,表示如果沒有CD-ROM中驅動器,因爲我的電腦同時包含DVD和藍光驅動器。如果有一個包含CSV文件的CD Rom,它會成功導入,但由於運行到藍光驅動器的foreach循環會彈出另一條消息,並彈出。

我只想顯示一個錯誤消息,對於這些情況: - 如果沒有光盤是準備幷包含在驅動 - 如果光驅CSV不包含CSV

我認爲我的邏輯過於複雜,我需要幫助調整我的邏輯陳述。

+1

使用'break'如果沒有csv文件發生一些錯誤(在MessageBox之後)。 –

+0

如果將原始查詢調整爲僅將已準備就緒的驅動器撤回,則可能會更容易。你也不需要'Any()'和'Where()'調用;如果沒有這樣的驅動器,那麼'Where()'將返回一個長度爲0的序列,您可以事先對其進行測試,或者只是對序列進行迭代,因爲對空序列不做任何處理。 – barrick

回答

0

你只需要跟蹤至少一個的驅動器爲你工作。如果他們都沒有,那麼你想輸出錯誤信息。還有其他一些你可以做的事情(不需要做Any/Where,不需要做.Equals(true)等等。更具體地說,不需要持續檢查它是否是正確的驅動器。cdRoms集合將只包含驅動器用正確的類型,因爲這是你在Where子句指定哪些

// Gets all the drives 
DriveInfo[] allDrives = DriveInfo.GetDrives(); 

// Get all the cd roms 
var cdRoms = allDrives.Where(x=>x.DriveType==DriveType.CDRom); 

if (cdRoms.Count() > 0) 
{ 
    bool found = false; 
    // Loop through the cd roms collection 
    foreach(var cdRom in cdRoms) 
    { 
     Console.WriteLine("Drive {0}", cdRom.Name); 
     Console.WriteLine(" File type: {0}", cdRom.DriveType); 

     if (cdRom.IsReady == true) 
     { 
      DirectoryInfo di = new DirectoryInfo(cdRom.RootDirectory.Name); 

      var file = di.GetFiles("*.csv", SearchOption.AllDirectories).FirstOrDefault(); 

      if (file == null) 
      { 
       errorwindow.Message = LanguageResources.Resource.File_Not_Found; 
       dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
      } 
      else 
      { 
       foreach (FileInfo info in di.GetFiles("*.csv", SearchOption.AllDirectories)) 
       { 
        Debug.Print(info.FullName); 
        ImportCSV(info.FullName); 
        found = true; 
        break;  // only looking for the first one 
       } 
      } 
     } 
     else 
     { 
      Debug.Print(string.Format("Drive {0} is not ready", cdRom.Name)); 

     } 
    } 
    if (!found) 
    { 
     errorwindow.Message = LanguageResources.Resource.CDRom_Not_Ready; 
     dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow);    
    } 
} 
else 
{ 
    errorwindow.Message = LanguageResources.Resource.CDRom_Error; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
} 
0

你的代碼可以改寫爲以下幾點:

var cdRoms = allDrives.Where(x => x.DriveType == DriveType.CDRom && x.IsReady); 

if (cdRoms.Any()) 
{ 
    foreach(var cdRom in cdRoms) 
    { 
     Console.WriteLine("Drive {0}", cdRom.Name); 
     Console.WriteLine(" File type: {0}", cdRom.DriveType); 

     var di = new DirectoryInfo(cdRom.RootDirectory.Name); 
     var file = di.GetFiles("*.csv", SearchOption.AllDirectories).FirstOrDefault(); 

     if (file == null) 
     { 
      errorwindow.Message = LanguageResources.Resource.File_Not_Found; 
      dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
     } 
     else 
     { 
      foreach (var info in di.GetFiles("*.csv", SearchOption.AllDirectories)) 
      { 
       Debug.Print(info.FullName); 
       ImportCSV(info.FullName); 
       break; 
      } 
     } 
    } 
} 
else 
{ 
    errorwindow.Message = LanguageResources.Resource.CDRom_Error; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
} 

變化:

  • 沒有必要使用WhereAny像你這樣,從所有驅動器過濾CD-ROM驅動器,看看是否存在任何
  • 只能選擇驅動器是 CD-ROM驅動器準備
  • 使用var如果可能的話,讓編譯器做的工作
0

這是我的做法,您的問題:

bool anyCdrom = false; 
bool anyReady = false; 
bool fileFound = false; 

// Loop through the cd roms collection 
foreach(var cdRom in DriveInfo.GetDrives().Where(drive => drive.DriveType == DriveType.CDRom)) 
{ 
    anyCdrom = true; 
    Console.WriteLine("Drive {0}", cdRom.Name); 
    Console.WriteLine(" File type: {0}", cdRom.DriveType); 
    if (cdRom.IsReady) // You may want to put in into the intial where 
    { 
     anyReady = true;   
     foreach (string file in Directory.EnumerateFiles(cdRom.RootDirectory.Name, "*.csv", SearchOption.AllDirectories)) 
     { 
      fileFound = true; 
      Debug.Print(file); 
      ImportCSV(file); 
      break;  // only looking for the first one 
     } 
     if(fileFound) 
      break;          
    }  
} 

if(!anyCdrom) 
{ 
    errorwindow.Message = LanguageResources.Resource.CDRom_Error; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
} 
else if(!anyReady) 
{ 
    errorwindow.Message = LanguageResources.Resource.CDRom_Not_Ready; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow);      
} 
else if(!fileFound) 
{ 
    errorwindow.Message = LanguageResources.Resource.File_Not_Found; 
    dialogService.ShowDialog(LanguageResources.Resource.Error, errorWindow); 
} 

它只打印時出現錯誤:

  1. 沒有光驅
  2. 沒有光驅準備
  3. 存在任何現成光盤