【发布时间】:2015-02-03 14:12:23
【问题描述】:
我的应用程序使用一个服务,该服务将在用户界面上向客户端发送一个问卷列表,当用户回答问题时,相同的数据被分配给模型并发送给服务以标记分数。
在服务中,我正在执行 ID 检查和答案检查(字符串),尽管它在调试器中显示相同的数据类型和值,但比较字符串不会返回 true。有人可以在这里指导我吗谢谢。
public double GetMarks(List<Questionnaire> qList) {
var AnsLibrary = GetAnswerLibrary();
double GetTotalNumberAnsquestion = qList.Count();
int numberValidCorrectAns = 0;
double result =0;
try {
if (GetTotalNumberAnsquestion > 0) {
foreach (var q in qList) {
string city =(q.UserAnsResponse);
string compare = AnsLibrary.Where(x => x.Question.QuestionId == q.QuestionId).Select(x => new { name = x.AnswerText }).SingleOrDefault().ToString();
//just a test to see if the compare is working
if (string.Compare(city, AnsLibrary[0].AnswerText) == 0) {
//for testing purpose
}
bool isAnswerExist = AnsLibrary.Any(x => x.Question.QuestionId == q.QuestionId);
if (q.isCorrectAnswer == true) {
if (isAnswerExist && AnsLibrary.Any(a => a.AnswerText == city)) {
numberValidCorrectAns++;
}
}
else {
if (isAnswerExist && !AnsLibrary.Any(x => x.AnswerText == q.UserAnsResponse)) {
numberValidCorrectAns++;
}
}
}
result = numberValidCorrectAns / GetTotalNumberAnsquestion * 100;
}
else {
throw new Exception("Unable to get User Answer Questinaire");
}
}
catch (Exception ex) {
ex.ToString();
}
return result;
}
}
控制器:
public ViewResult GetMarks(List<QuestionnaireViewModel> _AnswwerQuestionaire) {
List<Questionnaire> serviceQuestionList = new List<Questionnaire>();
foreach(var questionaire in _AnswwerQuestionaire){
serviceQuestionList.Add(new Questionnaire() { QuestionId=questionaire.QuestionId, UserAnsResponse=questionaire.UserAnsResponse, isCorrectAnswer=questionaire.isCorrectAnswer});
}
var IQservice = new IQuestionService.QuestionServiceClient();
var result = IQservice.GetMarks(serviceQuestionList);
if(result > 0) {
ViewData["Marks"] = result;
} else {
ViewData["Error"] = "Unable to Marks your assesment";
}
return View(result);
}
数据样本:
public static List<Answer> GetAnswerLibrary() {
List<Answer> AnsLibrary = new List<Answer>();
AnsLibrary.Add(new Answer() { AnswerId = 1, AnswerText = "London", Question = new Questionnaire() { QuestionId= 11 } });
AnsLibrary.Add(new Answer() { AnswerId = 2, AnswerText = "paris", Question = new Questionnaire() { QuestionId = 22 } });
AnsLibrary.Add(new Answer() { AnswerId = 3, AnswerText = "Warsaw", Question = new Questionnaire() { QuestionId = 33 } });
AnsLibrary.Add(new Answer() { AnswerId = 4, AnswerText = "Port louis", Question = new Questionnaire() { QuestionId = 44 } });
AnsLibrary.Add(new Answer() { AnswerId = 5, AnswerText = "Berlin", Question = new Questionnaire() { QuestionId = 55 } });
return AnsLibrary;
}
//this is a hack normally will pull data from a data source like DB/CSV
public static List<Questionnaire> GetQuestionLibrary() {
List<Questionnaire> QuestionLibrary = new List<Questionnaire>();
QuestionLibrary.Add(new Questionnaire(11) { Title = "Geo", QuestionAsk = "What is the capital of England", QuestionnaireType = 1 });
QuestionLibrary.Add(new Questionnaire(22) { Title = "Geo", QuestionAsk = "What is the capital of France", QuestionnaireType = 1 });
QuestionLibrary.Add(new Questionnaire(33) { Title = "Geo", QuestionAsk = "What is the capital of Poland", QuestionnaireType = 1 });
QuestionLibrary.Add(new Questionnaire(44) { Title = "Geo", QuestionAsk = "What is the capital of Mauritius", QuestionnaireType = 1 });
QuestionLibrary.Add(new Questionnaire(55) { Title = "Geo", QuestionAsk = "What is the capital of Germany", QuestionnaireType = 1 });
return QuestionLibrary;
}
【问题讨论】:
-
它可能不起作用的一个原因是您“总是”将问题的答案与答案集中的第一个答案进行比较。即 string.Compare(city, AnsLibrary[0].AnswerText。这里 AnsLibrary 的索引始终为 0。
-
我添加这些行仅用于测试目的,即使我删除了这些行 ///string compare = AnsLibrary.Where(x => x.Question.QuestionId == q.QuestionId).Select(x => 新 { name = x.AnswerText }).SingleOrDefault().ToString(); //只是一个测试,看看比较是否有效 if (string.Compare(city, AnsLibrary[0].AnswerText) == 0) { //用于测试目的 } // 它仍然不工作
-
非常基本的问题。您是否在调试器中检查了“city”和“AnsLibrary[0].AnswerText”具有相同的值?
-
我做了相同的数据类型和相同的值
-
string.Compair 使用当前文化来获取特定于文化的信息,例如它是如何比较大写和小写的。我建议您使用 string.Compair 的重载来忽略区分大小写的比较。你可以试试 if(string.compair(city, AnsLibrary[0].AnswerText,true)==0)。注意第三个参数。
标签: c# asp.net wcf asp.net-mvc-3 asp.net-mvc-4