在我的项目中,我需要一些类似于学生成绩系统的功能,其中必须使用 泛型 。用户可以输入数据或我们可以从数据库中获取数据,但演示基本功能将如下所示
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第二段代码。所以我的困难在于合并这两段代码。感谢。
答案 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设置了它。代替。我认为这只会使解决方案复杂化,但至少可以轻松创建不同的实现。