如何使用linq过滤和求和

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

class Employee { string name ...; string age .....; int empType ...; int income ...; } List myList ...; List toList...; int totalIncomeOfToList = 0; foreach(Employee emp in myList) { if(emp.empType == 1) { toList.Add(emp); totalIncomeOfToList += emp.income; } } 

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

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

 var toList = myList.Where(e => e.empType == 1).ToList(); var totalIncomeOfToList = toList.Sum(e => e.income); 

不可否认,就两次吹过处理器缓存而言,这可能效率稍低,但如果它很重要,我会感到惊讶。 如果您可以certificate它重要,您可以随时返回“手动”版本。

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

我知道LINQ不应该有副作用,但它的价值是什么……

 int totalIncomeOfToList = 0; List toList = myList .Where(emp => emp.empType == 1) .Select(emp => { totalIncomeOfToList += emp.income; return emp; }) .ToList(); 

试试这个以获得总收入

 var totalIncomeOfToList = myList.Where(e => e.empType == 1).Sum(e => e.income); 

如果您还想要过滤员工列表,那么:

 var toList = myList.Where(e => e.empType == 1).ToList(); var totalIncomeOfToList = toList.Sum(e => e.income); 

使用foreach时性能稍好一些,但这样代码将更加清晰和精确。