-2

在我的程序中,我有一个标记列表和一个存储 studentId 的字典。我希望用户输入 studentId 并根据该 id 指向标记列表。我认为我执行不正确。有人可以帮助我实施它。谢谢

 public class Student() {
        private string name;
        private string surname;
        private string dob;
        private string address;
        private int id;

        public Student()
        {
        }
        public Student(string year,string name, string surname, string dob, string address)
        {
            this.name = name;
            this.surname = surname;
            this.dob = dob;
            this.address = address;
            this.year = year;
        }


      public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public string Surname
        {
            get { return surname; }
            set { surname = value; }

        }

        public string DOB
        {
            get { return dob; }
            set { dob = value; }
        }

        public string Addr
        {
            get { return address; }
            set { address = value; }

        }
        public int Id
        {
            get { return id; }
            set { id = value; }
        }


        private string year;

        public string Year
        {
            get { return year; }
            set { year = value; }

        }
         public Student(string s)
        {
            string[] splitted = s.Split(',');
            name = splitted[0];
            surname = splitted[1];
            dob = splitted[2];
            address = splitted[3];
           // id = splitted[4];          
         }
        public Dictionary<int,List<Marks>> dictionary= new Dictionary<int,List<Marks>>();
        public List<Marks> Mathematics = new List<Marks>();
        public List<Marks> English = new List<Marks>();
        public List<Marks> Maltese = new List<Marks>();
        public List<Marks> ReligiousStudies = new List<Marks>();
        public List<Marks> SocialStudies = new List<Marks>();
        public Dictionary<int, List<Marks>> dictionar = new Dictionary<int, List<Marks>>();


        public void AddMarks(int hyexam, int anexam)
        {
            {
                Console.WriteLine("enter id of student to input marks to:");
                string id = Console.ReadLine();
                if (dictionar.ContainsKey(Id).Equals(id))
                {
                    Mathematics.Add(new Marks(hyexam, anexam));
                    English.Add(new Marks(hyexam, anexam));
                    Maltese.Add(new Marks(hyexam, anexam));
                    ReligiousStudies.Add(new Marks(hyexam, anexam));
                    SocialStudies.Add(new Marks(hyexam, anexam));
                    dictionar.Add(id, (Mathematics)); //dont know how to implement it
                }
                else
                {
                    Console.WriteLine("id not found");
                }

            }
        }

   public class Marks
    {
        private int hyexam;
        private int anexam;
        private string id;
        public int HYEXAM
        {
            get { return hyexam; }
            set { hyexam = value; }
        }

        public int ANEXAM
        {
            get { return anexam; }
            set { anexam = value; }
        }

        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public Marks(int hyexam, int anexam)
        {          
            this.hyexam = hyexam;
            this.anexam = anexam;
        }
        public Marks(string id)
        {
            this.id = id;
        }

        public double OverallExam()
        {
            return (0.4 * hyexam) + (0.6 * anexam);
        }

    }
}
4

3 回答 3

4

我会说主要问题是你的建模。您已Dictionary<int, List<Marks>>Student. 这意味着每个 Student对象都有一个字典。这是没有意义的——因为字典的键是学生证,对吧?

Student对于您当前获得的标记列表中的每个对象来说,它可能是有意义的(尽管不是公共字段,IMO)。鉴于这些信息,你真的需要Dictionary去标记吗?在Dictionary<int, Student>某个地方(不在Student课堂上 - 可能在School课堂上?)将每个学生 ID 映射到 a会不会更干净Student,并且您可以从Student?

认真思考您想要实现的目标,以及数据真正属于哪里。以我的经验,当您正确地进行数据建模时,代码通常会以一种简洁的方式出现。

(我还会Marks在名称和设计方面质疑您的课程。这些属性代表什么?它真的不是考试中的一个分数吗?也许ExamResult会更清楚?它真的需要可变吗? )

于 2012-12-04T17:45:28.453 回答
1

我同意乔恩的观点,这绝对是一个建模问题(基于 OP 的其他帖子)。如果您是面向对象编程的新手,您需要做的第一件事是确定您需要创建哪些对象来回答问题。

什么是学生?学生有姓名、身份证、出生日期、班级年份等。对于学生拥有的每个属性,您需要设置一个字段或属性。

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public DateTime DoB { get; set; }
    ... etc ...
}

什么是标记?根据您的描述,Mark 有一个主题、一个期中考试分数和一个年考分数。

public class Mark
{
    public string Subject { get; set; }
    public int MidScore { get; set; }
    public int FinalScore { get; set; }
}

学生和标记之间是什么关系?一个学生有一个与他们相关的标记列表。这最好用 List<> 对象来描述。

public class Student() // continued
{
    public List<Mark> Marks { get; set; }
}

一旦您为您的对象设置了基础知识,就可以更轻松地过滤掉您不需要的内容,并且更容易回答您的问题。:)

于 2012-12-04T19:34:45.520 回答
0

我的建议:

你的“Mark”类必须有一些标识主题的东西(可以是一个名为 Subject 的枚举,或者一个字符串,或者一个带有主题 ID 的 int,如果你将它存储在数据库中)

然后你可以有:

Console.WriteLine("enter id of student to input marks to:");
string id = Console.ReadLine();

var marks = new Dictionary<int, List<Mark>>();

if (UserExists(id))
{
    Console.WriteLine("mark for subject1:");        
    string s1 = Console.ReadLine();
    Console.WriteLine("mark for subject2:");        
    string s2 = Console.ReadLine();

    var list = new List<Mark>();
    list.Add(new Mark { Subject = SubjectEnum.Subject1, Value = Convert.ToDecimal(s1), });
    list.Add(new Mark { Subject = SubjectEnum.Subject2, Value = Convert.ToDecimal(s2), });

    marks.Add(Convert.ToInt32(id), list)
}
else
{
    Console.WriteLine("id not found");
}

希望这可以帮助。

于 2012-12-04T17:59:06.440 回答