【问题标题】:Unable to do string comparison + post collection using wcf无法使用 wcf 进行字符串比较 + 后收集
【发布时间】: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


【解决方案1】:

我设法解决了这个问题,下面是我所做的修改。有点奇怪。

 public double GetMarks(List<Questionnaire> qList) {

        var AnsLibrary = GetAnswerLibrary();

        double result = 0;
        double TotalNumberofQuestion = qList.Count();
        int UserValidAnswer = 0;

        if(TotalNumberofQuestion >0) {

            var filterQuestionaire = qList.Where(q => q.UserAnsResponse != null).ToList();

            foreach (var q2 in filterQuestionaire) {


                bool checkOnlyAnswerQuestion = AnsLibrary.Any(x => x.Question.QuestionId == q2.QuestionId);

                if(checkOnlyAnswerQuestion) {

                string city = (q2.UserAnsResponse).Trim();
                string city2 = AnsLibrary.Where(x => x.Question.QuestionId == q2.QuestionId).Select(t => t.AnswerText).SingleOrDefault().Trim();

                    bool checkuserAnswer = (city == city2) ;

                    if(q2.isCorrectAnswer == true && checkuserAnswer == true){
                        UserValidAnswer++;
                    }

                    if(q2.isCorrectAnswer == false && checkuserAnswer == false) {

                        UserValidAnswer++;
                    }
                }
            }
            result = UserValidAnswer / TotalNumberofQuestion * 100;
        }
        return result;
    }

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多