2017-06-16 15 views
2

こんにちは、私のコードの基本的な疑問は "悪い習慣ですか?"基本的に私がリーダー機能からデータを読み込み、値既存のTO LIST(いくつかの小道具)を挿入しています私のコードは、このrefリスト関数の混乱

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でこれを尋ねてください。私はまだデバッグしていませんでしたが、私は混乱していますので、私はすでに1回以上審査されているリストを参照しています。 –

+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; 
     } 
    } 

これは変更できます。