在 c# linq 中,是否可以在匿名选择中分配值

本文关键字:选择 分配 linq 是否 | 更新日期: 2023-09-27 18:37:02

这是我的代码:

   userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => new
                {
                    correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                    incorrectAnswersCount = 80 -  correctAnswersCount
                })

是否可以在选择中获取正确的答案计数值并将其用于其他变量?例如,现在我正在计算两次正确答案计数,因为上面的代码不起作用:

  userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => new
                {
                    correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                    incorrectAnswersCount =  80 - uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count(),
                })

在 c# linq 中,是否可以在匿名选择中分配值

您可以使用像

这样的匿名代码块:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => 
{
    var corrAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
    return new 
    {
        correctAnswersCount = corrAnswersCount,
        incorrectAnswersCount = 80 -  corrAnswersCount
    }
})

或者,如果您更喜欢查询语法:

userQuizzes = from quiz in user.UserQuizes
              order by quiz.VerbalQuizStartDate
              let count = quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count()
              select new 
              {
                  correctAnswersCount = count,
                  incorrectAnswersCount = 80 - count
              }

您可以使用 do:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq =>
{ 
       var count = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
       return new
                    {
                        correctAnswersCount = count,
                        incorrectAnswersCount = 80 -  count
                    }
});

您可以将变量中的任何临时结果存储在 lambda 函数的主体中,例如:

userQuizzes = user.UserQuizes
               .OrderBy(uq => uq.VerbalQuizStartDate)
               .Select(uq => 
                           { 
                               var count = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
                               //var temp2 = other calculations or something if You want...;
                               return new
                               {
                                   correctAnswersCount = count,
                                   incorrectAnswersCount =  80 - count
                               }
                           }
               );

您可以使用 lambda 函数,在该函数中,您可以在创建匿名对象之前计算correctAnswersCount,然后将其用于两个属性:

userQuizzes = user.UserQuizes.OrderBy(uq => uq.VerbalQuizStartDate).Select(uq => {
    var correctAnswersCount = uq.Quiz.MathQuizes.Where(m => m.ISMovedAnswerCorrect).Count() + uq.Quiz.VerbalQuizes.Where(v => v.ISMovedAnswerCorrect).Count();
    return new 
    {
        correctAnswersCount = correctAnswersCount ,
        incorrectAnswersCount = 80 - correctAnswersCount
    };
});