来自Any的Linq更新excel表

时间:2016-11-05 03:50:57

标签: c# excel vba linq

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

1 个答案:

答案 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;