我刚刚在学习 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
公开,因此很明显它不能被直接修改,因为它没有 Add
或 Remove
。 _Students
,Dictionary
用作此属性的支持者/来源。我还公开了一个
AddStudent
方法,该方法将处理添加学生并检查重复项 Numbers
。进一步说明 :
_Students
是 protected
,因此从 SchoolClass
派生的任何类都可以访问它。在这种情况下似乎很有可能。我没有为
set { }
定义 Students
,因为它充当不应直接修改的集合。不创建提供 set
使得修改它的唯一方法是通过修改 _Students
(它的支持者)。关于c# - 如何验证类中 List<> 属性中的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19271883/