如何用/ Where条件优化这个LINQ表达式并调用Method?

时间:2013-02-14 10:15:44

标签: c# linq lambda

我正在寻找有关以下方法的任何建议或提示,即使用LINQ在Collection中找到null的某个属性,然后遍历结果(子列表)并从另一个属性执行方法相同的集合。

private void SetRaises()
{
    if (employeeCollection != null)
    {
      var noRaiseList = employeeCollection .Where(emp => emp.Raise == null).ToList();
      foreach (var record in noRaiseList )
      {
         CalculateRaise(record);
      }
    }
}

public void CalculateRaise(Employee emp)
{
    if (emp!= null)
        emp.Raise = emp.YearsOfService * 100;
}

我在第一种方法SetRaises()中不喜欢的部分是以下片段:

foreach (var record in noRaiseList )
{
    CalculateRaise(record);
}

有没有办法直接将该部分集成到我的LINQ表达式中,即我不知道的一些扩展方法?

谢谢!

4 个答案:

答案 0 :(得分:5)

您可以做的第一件事是:不生成中间列表

 var pending = employeeCollection.Where(emp => emp.Raise == null);
 foreach (var record in pending)
 {
     CalculateRaise(record);
 }

与:

相同
 foreach (var record in employeeCollection.Where(emp => emp.Raise == null))
 {
     CalculateRaise(record);
 }

现在这是非缓冲的延迟执行。

但坦率地说,LINQ在这里并没有给你太多帮助。你也可以:

foreach(var emp in employeeCollection)
{
    if(emp.Raise == null) CalculateRaise(emp);
}

答案 1 :(得分:0)

如果您不需要Raise就不需要员工名单,您可以在一行中执行此操作:

employeeCollection.Where(emp => emp.Raise == null).ToList().ForEach(x => x.Raise = x.YearsOfService * 100);

答案 2 :(得分:0)

您可以使用ForEach链方法。但这只是糖的语法。

employeeCollection.Where(emp => emp.Raise == null)
                  .ToList()
                  .ForEach(record => CalculateRaise(record))

答案 3 :(得分:0)

它应该是这样的:

var noRaiseList = employeeCollection .Where(emp => emp.Raise == null).ToList().ForEach(e=>e.Raise = e.YearsOfService * 100);