Linq从任何更新Excel表

我想用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; } 

你的陈述有点多余。 另外,员工姓名或收费号码是否唯一? 如果是这样,一个.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属性为空,这将基本上防止抛出空的exception错误。 您也可以使用First()并将其包装在try catch块中,因为如果没有find条目,则First()抛出一个错误(如果没有find条目,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;