2017-06-16 56 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; 
     } 
    } 

你可以改變這一點。