没有性能损失的最佳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;
}
}
答案 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,性能会略好一些,但这样代码就会非常清晰和准确。