gpt4 book ai didi

c# - 如何为学生和多个类(class)成绩创建字典?

转载 作者:行者123 更新时间:2023-11-30 23:07:07 24 4
gpt4 key购买 nike

我正在学习 C# 字典,但我很困惑该怎么做

我有一本学生姓名词典。我想为它分配另一本字典。

我的输入类似于此

学生 1: 数学,9 科学,5 英文,2

学生 2: 数学,9 科学,10 英文,7

我试图创建一个名为 Info 的类,这是我的代码

    public class Info
{
public string course { get; set; }
public int grade { get; set; }

public Info(string c, int g)
{
course = c;
grade = g;
}

internal IDictionary<string, Info> infoDic { get; private set; }

public void Set(string Sname, string course, int grade)
{
Student s = new Student(Sname);
var infor = new Info(course, grade);
infoDic = new Dictionary<string, Info>();
infoDic.Add(s.Name, infor);

//return infoDic;
}

public Dictionary<string, Info> retrieve (string name)
{
Student s = new Student(name);
return infoDic;
}
}
}

这是另一种尝试:

我尝试制作 Info 类,主要是创建 Dictionary 并给出值,但问题是我有 3 门类(class)和 10 名学生,有时我只需要检索所有类(class)的数学成绩学生。

如何改进代码区分类(class)?或者如何将类(class)名称作为另一个键?

public class Info
{
public string course { get; set; }
public int grade { get; set; }

public Info(string c, int g)
{
course = c;
grade = g;
}

}


class Test
{
public static void Main(string[] args)
{

Dictionary<string, Info> information = new Dictionary<string, Info>();
Info i1 = new Info("math", 9);
information.Add("Student1", i1);
Info i2 = new Info("science", 11);
information.Add("Student1", i2);
Info i3 = new Info("math", 13);
information.Add("student2", i3);

foreach (KeyValuePair<string, Info> eee in information)
{
Console.WriteLine("{0}\t{1}\t{2}", eee.Key, eee.Value.type, eee.Value.count);
}

}
}

我需要两种方法,一种是设置用户输入的值,另一种是在用户需要时检索特定的类(class)值

有什么建议吗?

最佳答案

将问题拆分成单独的关注点。

使用 StudentInfo类只是为了存储数据。重要的是,每个学生都拥有自己类(class)的集合。

public class Student {

public Student(string name) {
Name = name;
Infos = new List<Info>();
}

public string Name {get; set;}

public ICollection<Info> Infos {get; set;}
}

public class Info {
public Info(string course, int grade) {
Course = course;
Grade = grade;
}

public string Course { get; set; }
public int Grade { get; set; }
}

数据访问由不同的类处理 StudentRepository .中央字典的类型是 IDictionary<string, Student>以学生姓名为键并隐藏在存储库中。

using System.Linq;

public class StudentRepository {
public StudentRepository() {
_studentsByName = new Dictionary<string, Student>();
}

// keep data store private so we can change the implementation
private IDictionary<string, Student> _studentsByName {get; set;}

public void Add(Student student) {
if (_studentsByName.ContainsKey(student.Name)) {
throw new ArgumentException($"Student '{student.Name}' already stored.");
}
_studentsByName.Add(student.Name, student);
}

public Student Get(string studentName) {
if (_studentsByName.ContainsKey(studentName)) {
return _studentsByName[studentName];
}
throw new ArgumentException("No student '" + studentName + "' stored.");
}

// Find Grade for certain student and course
public int GetGrade(string studentName, string course) {
if (_studentsByName.ContainsKey(studentName)) {
var student = _studentsByName[studentName];
var courseInfo = student.Infos.FirstOrDefault(i => i.Course == course);
if (courseInfo != null) {
return courseInfo.Grade;
}
else {
throw new ArgumentException(
$"Student '{studentName}' did not take the course '{course}'.");
}
}
else {
throw new ArgumentException($"No student '{studentName}' found.");
}
}

// Get dictionary of all students that took a certain course. Key: student name
public IDictionary<string, Info> GetCoursesByStudentName(string course) {

// Use LINQ to retrieve the infos you need.
// Here I create a new dictionary with Student name as Key and
// the first matching course info found as value.
// (Students that did not take this course are not in this dictionary):
return _studentsByName
.Where(kvp => kvp.Value.Infos.Any(i => i.Course == course))
.ToDictionary(kvp => kvp.Key,
kvp => kvp.Value.Infos.First(i => i.Course == course));
}
}

使用示例:

const string MathCourseName = "Math";

var Student1 = new Student("Alice");
Student1.Infos.Add(new Info(MathCourseName, 4));

var Student2 = new Student("Bob");
Student2.Infos.Add(new Info(MathCourseName, 2));

var Student3 = new Student("Cesar");
Student3.Infos.Add(new Info("English", 3));

var repository = new StudentRepository();

repository.Add(Student1);
repository.Add(Student2);
repository.Add(Student3);

foreach(var kvp in repository.GetCoursesByStudentName(MathCourseName)) {
Console.WriteLine(kvp.Key + ": " + kvp.Value.Course + " - " + kvp.Value.Grade);
}

var bobsMathGrade = repository.GetGrade("Bob", MathCourseName);
Console.WriteLine("Bobs math grade: " + bobsMathGrade);

C# Fiddle for this example

关于c# - 如何为学生和多个类(class)成绩创建字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47567171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com