如何使用linq过滤和求和

Nit*_*ith 4 c# linq

什么是最好的LINQ方法,没有性能损失?我们怎样才能使用LINQ迭代列表一次呢?

class Employee  
{  
    string name ...;  
    string age .....;  
    int empType ...;  
    int income ...;  
}  

List<Employee> myList ...;  
List<Employee> toList...;  
int totalIncomeOfToList = 0;  

foreach(Employee emp in myList)  
{  
    if(emp.empType == 1)  
    {  
        toList.Add(emp);  
        totalIncomeOfToList += emp.income;  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 11

(我假设你也想要过滤列表 - 到目前为止给出的其他答案只会得到总和,而不是列表.如果你不需要列表,它们绝对没问题,但是它们是不等同于您的原始代码.)

那么你可以只迭代原始列表一次 - 然后迭代过滤后的列表:

var toList = myList.Where(e => e.empType == 1).ToList();
var totalIncomeOfToList = toList.Sum(e => e.income);
Run Code Online (Sandbox Code Playgroud)

诚然,这可能是一个有点低效率通过处理器缓存吹两次的条件,但我会感到惊讶,如果它是显著.如果您可以证明它重要,您可以随时返回"手动"版本.

可以在其中写一个带有副作用的投影,一次性完成所有这一切,但这太难看了,除非我真的被迫这样做,否则我甚至不会把它包括在答案中.