【问题标题】:Update property of object using linq but the method after updating doesnt compute properly使用 linq 更新对象的属性,但更新后的方法计算不正确
【发布时间】:2018-10-15 02:53:16
【问题描述】:

属性正在更新,但是当再次调用学生的方法时,它会计算但返回 0。但是,学生考试的总项和总正确项已更新并具有值。

这是学生课的代码

public class Student : Person, IStudentGrade, IGrade
{
    public List<Exam> ExamList { get; set; }
    public Recitations Recitations { get; set; }

    public double ComputeMidtermGrade()
    {
        var midterm = ExamList.Where(e => e.Term.Equals(Terms.Midterm)).SingleOrDefault();
        var midtermGrade = ((((midterm.TotalCorrectItem / midterm.TotalItem) * 50) / 50) * 0.25) * 100;
        return midtermGrade;
    }

    public double ComputeFinalsGrade()
    {
        var finalsterm = ExamList.Where(e => e.Term.Equals(Terms.Finals)).SingleOrDefault();
        var finalsGrade = ((((finalsterm.TotalCorrectItem / finalsterm.TotalItem) * 50) / 50) * 0.25) * 100;
        return finalsGrade;
    }

    public double ComputePrelimsGrade()
    {
        var prelims = ExamList.Where(e => e.Term.Equals(Terms.Prelims)).SingleOrDefault();
        var prelimGrade = ((((prelims.TotalCorrectItem / prelims.TotalItem) * 50) / 50) * 0.25) * 100;
        return prelimGrade;
    }

    public double RecitaionGrade()
    {
        var sum = Recitations.RecitationsList.Sum(r => r.Grade);
        var recitationGrade = (sum / Recitations.RecitationsList.Count) * 0.25;
        return recitationGrade;
    }

    public double ComputeTotalGrade()
    {
        var totalgrade = ((ComputePrelimsGrade() + ComputeMidtermGrade() + ComputeFinalsGrade() + RecitaionGrade()));
        return totalgrade;
    }
}

正如您在第一张图片中看到的那样,这很好用

但更新属性后返回值为 0,但属性有值。

图1中100%及格,图2中新的TOTAL GRADE是在学生课堂上用这种方法计算出来的。

public double ComputeTotalGrade()
{
    var totalgrade = ((ComputePrelimsGrade() + ComputeMidtermGrade() + ComputeFinalsGrade() + RecitaionGrade()));
    return totalgrade;
}

所以任何人都可以帮助我为什么它在 ComputeMidtermGrade()、ComputeFinalsGrade()、ComputePrelimsGrade() 中返回 0

更新学生成绩后查看,可以看到预科、期中和期末成绩均为0。但预科成绩karl的分数为5/10(考试班的属性)

public enum Terms { Prelims, Midterm, Finals };
public class Exam
{
    public Terms Term {get; set;}
    public int TotalItem { get; set; }
    public int TotalCorrectItem { get; set; }
}

编辑: 第1图第1视图,第2图编辑等级,第3图编辑后第2视图

【问题讨论】:

  • 调试你的代码。更新后查找Exam.TotalCorrectItem为什么为0。另外((x) * 50) / 50) 始终是(x)
  • 它有值 Exam.TotalCorrectItem 和 Exam.TotalCorrectItem 你可以在最后一张图像中看到它的初步分数:karl 5/10,5 是考试总正确项目,10 是图腾。但它在 prelim 中返回 0。我刚刚调用了我在第一张图片中使用的相同方法,它计算了初步成绩。

标签: c# linq oop properties


【解决方案1】:

如果 TotalCorrectItem 小于 TotalItem,则操作 x.TotalCorrectItem / x.TotalItem 的结果将始终为零,因为您使用的是 int 类型。更改为双精度或小数。

【讨论】:

  • 或使用(double)x.TotalCorrectItem / (double)x.TotalItem...并将其存储在浮点中
  • 我已经有条件了。正如您在第一张图片中看到的那样,它已经在工作了。但是一旦我更新了学生的成绩。然后调用它返回的计算方法 0
  • 当总成绩为零时,当时 midterm.TotalCorrectItem, midterm.TotalItem, finalsterm.TotalCorrectItem, finalsterm.TotalItem,prelims.TotalCorrectItem, prelims.TotalItem 的值是多少? 5 和 10 ,据我所知
  • @Z.R.T 将编辑我的帖子。将在更新属性之前和之后上传新图像。
  • 尝试 public double TotalItem { get;放; } 和 public double TotalCorrectItem { get;放; }
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2010-09-21
相关资源
最近更新 更多