Kuz*_*zco 4 c# linq object-initializers
我正在使用一个linq查询,看起来(经过一些简化)后面的内容如下:
List<UserExams> listUserExams = GetUserExams();
var examData =
from userExam in listUserExams
group by userExam.ExamID into groupExams
select new ExamData()
{
ExamID = groupExams.Key,
AverageGrade = groupExams.Average(e => e.Grade),
PassedUsersNum = groupExams.Count(e => /* Some long and complicated calculation */),
CompletionRate = 100 * groupExams.Count(e => /* The same long and complicated calculation */) / TotalUsersNum
};
Run Code Online (Sandbox Code Playgroud)
困扰我的是对PassedUsersNum和CompletionRate两次出现的计算表达式.
假设CompletionRate = (PassedUsersNum / TotalUsersNum) * 100,如何通过重用PassedUsersNum的计算来编写它,而不是再次编写该表达式?
最简单的方法是首先使用let注入另一个选择步骤:
List<UserExams> listUserExams = GetUserExams();
var examData =
from userExam in listUserExams
group by userExam.ExamID into groupExams
let passCount = groupExams.Count( /* long expression */)
select new ExamData()
{
ExamID = groupExams.Key,
AverageGrade = groupExams.Average(e => e.Grade),
PassedUsersNum = passCount,
CompletionRate = 100 * passCount / TotalUsersNum
};
Run Code Online (Sandbox Code Playgroud)
当然,每个组只会评估一次表达式.