【问题标题】:Simplifying logic to avoid duplicate error messages简化逻辑以避免重复的错误消息
【发布时间】:2014-09-14 14:13:56
【问题描述】:

到目前为止,我有以下内容:

// 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);
}

下面的问题是,由于我的电脑同时包含DVD和蓝光驱动器,所以连续两次弹出错误消息指示驱动器中是否没有CD-ROM。如果存在包含 CSV 文件的 CD ROM,它会成功导入,但由于运行到蓝光驱动器并弹出的 foreach 循环,会弹出另一条消息。

我只想针对以下每种情况显示一条错误消息: - 如果没有准备好并且驱动器中包含 csv 的 CD ROM - 如果 CD ROM 驱动器不包含 csv

我认为我的逻辑太复杂了,我需要帮助调整我的逻辑语句。

【问题讨论】:

  • 如果出现错误(在 MessageBox 之后),请使用 break
  • 如果您将原始查询调整为仅拉回就绪的驱动器,您可能会发现它更容易。您也不需要Any()Where() 调用;如果没有这样的驱动器,那么Where() 将返回一个长度为 0 的序列,您可以预先对其进行测试,或者只对序列进行迭代,因为不会对空序列执行任何操作。

标签: c# wpf logic driveinfo


【解决方案1】:

您只需要跟踪是否至少有一个驱动器适合您。如果他们都没有这样做,那么您想要输出错误消息。您还可以做一些其他的事情(不需要做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);
}

【讨论】:

    【解决方案2】:

    您的代码可以重写为:

    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,让编译器完成这项工作

    【讨论】:

      【解决方案3】:

      这是我解决问题的方法:

      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. 任何准备好的 cdrom 中都没有 csv 文件

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 2020-08-12
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-06-23
        相关资源
        最近更新 更多