2

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

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

4 回答 4

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);
}
于 2013-02-14T10:17:44.813 回答
0

如果您不需要 Raise 的员工列表,您可以在一行中执行此操作:

employeeCollection.Where(emp => emp.Raise == null).ToList().ForEach(x => x.Raise = x.YearsOfService * 100);
于 2013-02-14T10:19:30.330 回答
0

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

employeeCollection.Where(emp => emp.Raise == null)
                  .ToList()
                  .ForEach(record => CalculateRaise(record))
于 2013-02-14T10:22:56.777 回答
0

它应该是这样的:

var noRaiseList = employeeCollection .Where(emp => emp.Raise == null).ToList().ForEach(e=>e.Raise = e.YearsOfService * 100);
于 2013-02-14T10:23:29.017 回答