将列表添加到字典中

时间:2012-12-04 17:39:20

标签: c#

在我的程序中,我有一个标记列表和一个存储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);
        }

    }
}

3 个答案:

答案 0 :(得分:4)

我说主要问题是你的建模。您已将Dictionary<int, List<Marks>>列为Student中的字段。这意味着每个 Student对象都有一个字典。这没有任何意义 - 因为字典的关键是学生ID,对吗?

对于每个Student对象来说,你可能已经获得了标记列表(尽管不是公共字段,IMO)。鉴于这些信息,你真的需要一个Dictionary去标记吗?在某个Dictionary<int, Student>类({em>不在Student类中 - 可能在School类中?)将每个学生ID映射到一个Student不是更清晰吗? Student,您可以从Marks

获取标记

认真思考你想要实现的目标,以及数据真正属于何处。根据我的经验,当您正确地进行数据建模时,代码通常会以干净的方式进行。

(我也会在名称和设计方面质疑你的ExamResult课程。这些属性意味着什么?在考试中它不是真正的单一标记吗?也许{{1}会更清楚吗?它真的需要是可变的吗?)

答案 1 :(得分:1)

我同意Jon的观点,这绝对是一个建模问题(基于OP的其他帖子)。如果您是面向对象编程的新手,首先需要确定需要创建哪些对象来解决问题。

什么是学生?学生有姓名,身份证,职务,课程年份等。对于学生拥有的每个属性,您需要设置一个字段或属性。

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

什么是马克?根据您的描述,马克有主题,考试中期分数和年度考试成绩。

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

学生和马克之间的关系是什么?学生有一个与他们相关的商标列表。这最好用List&lt;&gt;来描述。对象

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

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

答案 2 :(得分: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");
}

希望这有帮助。