LINQ查询中的对象初始值设定项 - 是否可以重用计算数据?

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的计算来编写它,而不是再次编写该表达式?

Jon*_*eet 6

最简单的方法是首先使用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)

当然,每个组只会评估一次表达式.