我想使用where子句更新带有Total Hours值的Excel单元格。我知道我目前这样做的方式非常低效。如何更改我的Linq语句以提高性能?
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;
}
答案 0 :(得分: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;
注意使用null条件运算符?在FirstOrDefault()方法之前和之后。如果没有符合条件的条目,或者条目的TotalHours属性为null,这将基本上防止抛出null异常错误。你也可以使用First()并将它包装在try catch块中,因为如果没有找到条目,First()会抛出一个错误(如果没有条目,FirstOrDefault()会将值设置为null进入)。这是尝试/捕获方法:
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;