我刚刚在学习 OOP,我在练习时遇到了问题。我有一个有学生的 SchoolClass。 SchoolClass 中的学生不允许具有相同的编号。我有以下几点:

class SchoolClass
{
    private List<Student> students;

    public List<Student> Students
    {
        get { return this.students; }
        set
        {
            if (value == null) throw new ArgumentNullException("Students list can not be null!");
            if (value.Select(n => n.Number).Distinct().Count() != value.Count())
                throw new ArgumentException("There are students in the list with the same class number!");
            this.students = value;
        }
    }
public SchoolClass( List<Student> students)
    {
        this.Students = students;
    }
}
class Student
{
    private uint number;

    public uint Number
    {
        get { return this.number; }
        set
        {
            if (value == 0) throw new ArgumentException("Student's number can not be null!");
            else this.number = value;
        }
    }

    public Student(string name, uint number)
    {
        this.Number = number;
    }
}

当我用相同的编号初始化 Main() 类中的两个学生时,我有一个 ArgumentException("列表中存在具有相同类(class)编号的学生!");正如预期的那样。但是当我有一个 SchoolClass (sc) 的实例并调用它的学生列表并使用 Add() (sc.students.Add(new Student(..)) 我可以插入一个具有重复编号的学生。同样是List.InsertAt() 方法。我读到 getter 可以使用 ReadOnlyCollection(...) 或 AsReadOnly() 只读完成,但是在这种情况下我如何将新学生添加到列表中?

避免/解决此问题的最佳做法是什么?

最佳答案

我建议使用 Dictionary ,因为它非常适合根据 Key 防止重复。在检查重复项时,它也比仅使用 List 快得多。

class SchoolClass
{
    protected Dictionary<uint, Student> _Students = new Dictionary<uint, Student>();
    public IEnumerable<Student> Students
    {
        get { return _Students.Values; }
    }

    public SchoolClass(List<Student> students)
    {
        if (students == null) throw new ArgumentNullException("Students list can not be null!");

        foreach (var student in students)
            AddStudent(student);
    }

    public void AddStudent(Student student)
    {
        if (_Students.ContainsKey(student.Number))
            throw new ArgumentException("There are students in the list with the same class number!");

        _Students.Add(student.Number, student);
    }
}

在示例中,我将 Students 作为 IEnumerable 公开,因此很明显它不能被直接修改,因为它没有 AddRemove_StudentsDictionary 用作此属性的支持者/来源。

我还公开了一个 AddStudent 方法,该方法将处理添加学生并检查重复项 Numbers

进一步说明 :
_Studentsprotected,因此从 SchoolClass 派生的任何类都可以访问它。在这种情况下似乎很有可能。

我没有为 set { } 定义 Students ,因为它充当不应直接修改的集合。不创建提供 set 使得修改它的唯一方法是通过修改 _Students (它的支持者)。

关于c# - 如何验证类中 List<> 属性中的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19271883/

10-11 08:35