2016-11-05 38 views
1

我想用where子句中的總時數值更新Excel單元格。我知道我目前的做法是非常低效的。我如何將我的Linq語句更改爲更高性能?Linq更新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

這個問題看起來像一個代碼審查代碼,而不是一個SO問題 – 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屬性爲空,這將基本上防止拋出空的異常錯誤。您也可以使用First()並將其包裝在try catch塊中,因爲如果沒有找到條目,則First()拋出錯誤(如果沒有找到條目,FirstOrDefault()將設置值爲null)。這裏的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