4

私は次のような(いくつかの単純化した後)ように見える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
};

気になるのは、PassedUsersNum と CompletionRate の計算式が 2 回出てくることです。

と仮定するとCompletionRate = (PassedUsersNum / TotalUsersNum) * 100、その式を再度記述する代わりに、PassedUsersNum の計算を再利用してどのように記述できますか?

4

2 に答える 2

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
    };

もちろん、式はグループごとに1回だけ評価されます。

于 2011-06-13T14:41:13.643 に答える
1

必要に応じて Func を返す別のメソッド、または double を取り bool を返すメソッドに Count 関数を抽出することもできます。

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(funcMethod()),
    PassedUsersNum = groupExams.Count(e => traditionalMethod(e)),
    CompletionRate = 100 * groupExams.Count(e => /* The same long and complicated calculation */) / TotalUsersNum
};

// later...
private Func<double,bool> funcMethod(){ return e=> /* your calculation */ }

private bool traditionalMethod(double d){ return /* your calculation */ }
于 2011-06-13T14:46:29.117 に答える