2016-11-05 95 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