如何使用linq过滤和求和

时间:2013-10-22 14:40:53

标签: 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;  
    }  
}  

3 个答案:

答案 0 :(得分:10)

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

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

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

不可否认,这可能是在两次吹过处理器缓存方面效率较低,但如果它很重要,我会感到惊讶。如果您可以证明 重要,那么您可以随时返回“手动”版本。

可以编写一个带有副作用的投影,一次性完成所有这一切,但这太丑了,我甚至不会把它包含在答案中,除非我是真的很想这样做。

答案 1 :(得分:1)

我知道LINQ不应该有副作用,而是因为它的价值......

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

答案 2 :(得分:0)

尝试获取总收入

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,性能会略好一些,但这样代码就会非常清晰和准确。