2017-06-16 62 views
2

嗨,我有一个疑问,在我的代码基本问题是“这是一个不好的做法?”基本上我阅读来自阅读器的功能数据和插入的值已经存在LIST(一些道具)我的代码是这样的混淆参考列表功能

private void TGenerateDriveDetailsFromReader<T>(SqlDataReader returnData, ref List<Systems> systemList) 
    { 
     try 
     { 
      while (returnData.Read()) 
      { 
       int MachineID = 0; 
       MachineID = returnData["MachineID"] is DBNull ? 0 : (int)returnData["MachineID"]; 
       if (systemList.Any(x => x.ID == MachineID)) 
       { 
        double totalSize = returnData["Size"] is DBNull ? 0 : Convert.ToDouble(returnData["Size"]); 
        double freeSpace = returnData["FreeSpace"] is DBNull ? 0 : Convert.ToDouble(returnData["FreeSpace"]); 
        int driveType = returnData["DriveTypeID"] is DBNull ? 0 : (int)(returnData["DriveTypeID"]); 
        InsertDriveDetailsToList(totalSize, MachineID, freeSpace, driveType, ref systemList); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 




    private void InsertDriveDetailsToList(double totalSize, int machineID, double freeSpace, int driveTypeID, ref List<Systems> systemList) 
    { 
     switch (driveTypeID) 
     { 
      case 1: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveCTotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveCFree = freeSpace; 
       break; 

      case 2: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveDTotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveDFree = freeSpace; 
       break; 

      case 3: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveETotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveEFree = freeSpace; 
       break; 

      case 4: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveFTotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveCFree = freeSpace; 
       break; 

      case 5: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveGTotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveGFree = freeSpace; 
       break; 

      case 6: systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveHTotal = totalSize; 
       systemList.Where(x => x.ID == machineID).FirstOrDefault().DriveHFree = freeSpace; 
       break; 
     } 
    } 

因此,与case语句的功能将同时读取环路我的问题是执行每次因为我也提到了这个列表,循环会不会影响性能?我应该改变方法吗?谢谢

+0

如果你的代码有效,而你只是在寻找代码审查的内容,那么你应该在[Code Review](https://codereview.stackexchange.com/) –

+0

@TiesonT上提问。我还没有调试,但我的困惑是因为我指的是已经被推荐一次或多次的列表,然后一次是会伤害代码稳定性? –

+0

你为什么在这里使用'ref'?我没有看到你在哪里做'systemList = ...' –

回答

0
private void TGenerateDriveDetailsFromReader<T>(SqlDataReader returnData, ref List<Systems> systemList) 
    { 
     try 
     { 
      while (returnData.Read()) 
      { 
       int MachineID = 0; 
       MachineID = returnData["MachineID"] is DBNull ? 0 : (int)returnData["MachineID"]; 
       if (systemList.Any(x => x.ID == MachineID)) 
       { 
        double totalSize = returnData["Size"] is DBNull ? 0 : Convert.ToDouble(returnData["Size"]); 
        double freeSpace = returnData["FreeSpace"] is DBNull ? 0 : Convert.ToDouble(returnData["FreeSpace"]); 
        int driveType = returnData["DriveTypeID"] is DBNull ? 0 : (int)(returnData["DriveTypeID"]); 
     Systems systems = systemList.Where(x => x.ID == machineID).FirstOrDefault(); 
        InsertDriveDetailsToList(totalSize, MachineID, freeSpace, driveType, systems); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 




    private void InsertDriveDetailsToList(double totalSize, int machineID, double freeSpace, int driveTypeID, Systems systems) 
    { 
     switch (driveTypeID) 
     { 
      case 1: systems.DriveCTotal = totalSize; 
       systems.DriveCFree = freeSpace; 
       break; 

      case 2: systems.DriveDTotal = totalSize; 
       systems.DriveDFree = freeSpace; 
       break; 

      case 3: systems.DriveETotal = totalSize; 
       systems.DriveEFree = freeSpace; 
       break; 

      case 4: systems.DriveFTotal = totalSize; 
       systems.DriveCFree = freeSpace; 
       break; 

      case 5: systems.DriveGTotal = totalSize; 
       systems.DriveGFree = freeSpace; 
       break; 

      case 6: systems.DriveHTotal = totalSize; 
       systems.DriveHFree = freeSpace; 
       break; 
     } 
    } 

你可以改变这一点。