2013-02-14 65 views
2

我正在寻求任何意见或提示,关于下面的方法,我已经使用LINQ找到一个集合中的某个属性为null,然后通过结果(子列表)并在另一个属性上执行方法相同的集合。如何优化这个LINQ表达式w/where条件和调用方法?

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表达式,即一种方式我不知道的一些扩展方法?

谢谢!

+1

你为什么显示'CalculateQd'当你使用'CalculateRaise'? – 2013-02-14 10:17:36

+0

没有必要调用'.ToList()'。 – Leri 2013-02-14 10:18:03

+0

看看这个问题:http://stackoverflow.com/questions/1968791/how-to-perform-an-update-using-linq-or-lambdac-asp-net-linq-lambda – 2013-02-14 10:20:36

回答

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); 
} 
+0

我们不能在一条线上做?只是问问。 – gaurav 2013-02-14 10:19:02

+5

@guarav当然 - 我只是想保持一致。但是,我不确定每个人为什么总是痴迷于“一切尽在一行”。这不是代码中的目标。 – 2013-02-14 10:19:45

+0

我有时候会感到内疚。 – Ash 2013-02-14 10:24:11

0

如果您不需要员工的名单没有提高,你可以在一行做到这一点:

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

这么多层次上都很糟糕。目前还不清楚;难以阅读;效率低下(中间名单;数据的多次迭代)。基本上,我会努力想出一个更丑陋的实现,除非我没有特别的原因在中间引入'DataTable'。 – 2013-02-14 10:23:29

+0

马克的男人!;) – user118190 2013-02-14 10:43:26

0

你可以使用ForEach链方法。但那只是糖语法。

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

看到我对gzaxx的帖子的评论;我所说的一切在这里也适用 – 2013-02-14 10:24:42

+0

谢谢,从您的评论中了解到新的东西! ;) – Abbas 2013-02-14 10:27:58

+0

Marc's the MAN! ;) – user118190 2013-02-14 10:42:49

0

应该是这样的:

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

请看我对gzaxx的帖子的评论;我所说的一切都适用于这里 – 2013-02-14 10:24:58

+0

Marc's the MAN! ;) – user118190 2013-02-14 10:44:03