2016-11-05 10 views
1

Excelセルをwhere句の合計時間値で更新したいとします。私は現在これをやっている方法がひどく非効率的であることを知っています。私のLinq文をよりパフォーマンスの高いものに変更するにはどうすればよいですか?Linq UpdateからExcelシートをすべて

if (employeeHours.Any(x => x.EmployeeName == newHours.EmployeeName && x.ChargeNumber == newHours.ChargeNumber)) 
{ 
    sheet.Cells[row, 5] = employeeHours.Where(x => x.EmployeeName == newHours.EmployeeName && x.ChargeNumber == newHours.ChargeNumber).FirstOrDefault().TotalHours; 
} 
+1

この質問は、私の質問ではなくコードレビューコードのように見えます – Tola

答えて

1

if文は少し冗長です。また、従業員名または課金番号は一意ですか?もしそうなら、.Single()ステートメントがより適切でしょう。

var hours = employeeHours.Where(x => x.EmployeeName == newHours.EmployeeName && x.ChargeNumber == newHours.ChargeNumber)?.FirstOrDefault()?.TotalHours; 

if (hours != null) 
    sheet.Cells[row, 5] = hours; 

注ヌル条件演算子の使用:彼らは一意でない場合、私は次のようにしてください?。 FirstOrDefault()メソッドの前と後。これにより、条件に一致するエントリがない場合、またはエントリのTotalHoursプロパティがnullの場合、null例外エラーが発生しないようになります。 First()は、エントリが見つからない場合にFirst()がエラーをスローするため、First()を使用してtry catchブロックでラップすることもできます(エントリが見つからない場合、FirstOrDefault()ここでのtry/catchのアプローチがあります:

try 
{ 
    sheet.Cells[row, 5] = employeeHours.Where(x => x.EmployeeName == newHours.EmployeeName && x.ChargeNumber == newHours.ChargeNumber).First().TotalHours; 
} 
catch (Exception) 
{ 
    // handle errors here 
    throw; 
} 

更新:お互いに使用された場合EmployeeNameとChargeNumberの両方が一意のIDを作るので、私は次のようにコードを更新したい:

var hours = employeeHours.SingleOrDefault(x => x.EmployeeName == newHours.EmployeeName && x.ChargeNumber == newHours.ChargeNumber)?.TotalHours; 

if (hours != null) 
    sheet.Cells[row, 5] = hours; 
+0

従業員と担当番号を合わせてユニークなキーを作成します。 – CodeMan5000

+0

@LarryBargersそうだとしたら、元の投稿の更新を見てください。 – Bryan

関連する問題