通用等级系统

时间:2014-08-01 18:51:39

标签: c# oop generics

在我的项目中,我需要一些类似于学生成绩系统的功能,其中必须使用 泛型 。用户可以输入数据或我们可以从数据库中获取数据,但演示基本功能将如下所示

 class Student
   {
      private string _name;
      private double _grade;


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

      public double Grade
      {
         get { return _grade; }
         set { _grade = value; }
      }


      public Student(string name, double grade)
      {
         this.Name = name;
         this.Grade = grade;
      }
   }



      class Students: List<Student>
       {
          public void Print()
          {
             Console.WriteLine("Student\t\tGrade");
             Console.WriteLine("-------------------------------");
              foreach (Student student in this)
              {
                if (student != null)
                {
                   Console.WriteLine(student.Name + "\t\t" + student.Grade);
                }
             }
          }
       }




     class Program
       {
          static void Main(string[] args)
          {
             Students students = new Students();

         //add the student to the list
         students.Add(new Student("Tom", 83));
         students.Add(new Student("Joe", 86));
         students.Add(new Student("Rudy", 85));
         students.Add(new Student("Chris", 87));
         students.Add(new Student("Keith", 85));
         students.Add(new Student("Pepe", 75));
         students.Add(new Student("Juan", 88.9));
         students.Add(new Student("Pedro", 75));
         students.Add(new Student("Pablo", 75));
         students.Add(new Student("Jose", 79));
         students.Add(new Student("Tommy", 88));

         //implement our custom comparer for grades
         //students.Sort(new StudentGradeComparer());


         students.Print();
         Console.ReadLine();
      }
   }

但后来增加了一些功能,比如我必须打印A,B,C,F,而不是像88或76这样的标记。它将如下所示,

if (marks >= 80) 
      grade = 'A';
   else if (marks >= 70) 
      grade = 'B';
   else if (marks >= 60)
      grade = 'C';
   else if (marks >= 50)
      grade = 'D';
   else if (marks >= 40)
      grade = 'E';
   else
      grade = 'U'; // unclassified

但是在我的可枚举和通用列表中我遇到了困难,请帮助我。使用泛型我的第一段代码工作正常并打印tom 88 joe 77等但我需要Tom A joe B with the formula by第二段代码。所以我的困难在于合并这两段代码。感谢。

2 个答案:

答案 0 :(得分:4)

有多种方法可以做到这一点,但我可能会做一些事情,比如在LetterGradeFromNumber课程中添加一个函数Students(另一种方法是您的Student课程中将返回字母等级的属性:

private string LetterGradeFromNumber(int marks)
{
    if (marks >= 80) 
      return 'A';
    else if (marks >= 70) 
      return 'B';
    else if (marks >= 60)
      return 'C';
    else if (marks >= 50)
      return 'D';
    else if (marks >= 40)
      return 'E';
    else
      return 'U'; // unclassified
    }
}

然后更改Print以获取参数以在数字和字母等级之间切换(或者如果需要,您可以创建单独的函数):

  public void Print(bool letterGrades = false)
  {
     Console.WriteLine("Student\t\tGrade");
     Console.WriteLine("-------------------------------");
     foreach (Student student in this)
     {
        if (student != null)
        {
           Console.WriteLine(student.Name + "\t\t" + letterGrades? LetterGradeFromNumber(student.Grade) : student.Grade.ToString());
        }
      }
  }

答案 1 :(得分:2)

首先,我不明白为什么泛型是必须的,或者他们甚至是如何适应的。为什么不能将数字等级添加到字母等级转换方法或属性{{{ 1}}课程?它看起来像是:

Student

或者:

public class Student
{
    public string LetterGrade {
        get {
            if (Grade >= 80)
                return "A";
            ...
        }
    }
}

但如果您必须使用通用的某些,您可以执行以下操作:

public class Student
{
    public string GetLetterGrade() {
        if (Grade >= 80)
            return "A";
        ...
    }
}

至少现在public class LetterGradeCalculator<T> where T : ILetterGradeFactory, new() { private readonly ILetterGradeFactory _factory; public GradeCalculator() { _factory = new T(); } public string GetLetterGrade(int numericalGrade) { return _factory.CreateLetterGrade(numericalGrade); } } public interface ILetterGradeFactory { string GetLetterGrade(int numericalGrade); } public class SixPointLetterGradeCalculator : ILetterGradeFactory { public string GetLetterGrade(int numericalGrade) { if (numericalGrade >= 94) return "A"; ... } } 是通用的...然后使用它来代替我之前写的LetterGradeCalculator属性。即使我走这条路线,我仍然不会使LetterGrade通用;我为构造函数D.I设置了它。代替。我认为这只会使解决方案复杂化,但至少可以轻松创建不同的实现。