C#班级组织和名单

C#班级组织和名单,c#,oop,list,C#,Oop,List,我正在开发一个C#应用程序,它由目标部门、课程和部门组成。每个系都有许多课程,每个课程都有许多部分。目前我有三个班:系、科和组。Department包含一些属性,然后列出课程,其中包含Department提供的课程。课程包含一些属性,然后列出部分,其中包含课程的部分。这是一种结构化代码的好方法,还是我应该用另一种方法 其次,当我在应用程序中实例化一个部门时,我设置了一些属性,然后开始将课程添加到department类中定义的课程列表中。然而,我似乎无法简单地从应用程序中添加Department.

我正在开发一个C#应用程序,它由目标部门、课程和部门组成。每个系都有许多课程,每个课程都有许多部分。目前我有三个班:系、科和组。Department包含一些属性,然后列出课程,其中包含Department提供的课程。课程包含一些属性,然后列出部分,其中包含课程的部分。这是一种结构化代码的好方法,还是我应该用另一种方法

其次,当我在应用程序中实例化一个部门时,我设置了一些属性,然后开始将课程添加到department类中定义的课程列表中。然而,我似乎无法简单地从应用程序中添加Department.Courses.Add(课程)。我必须在Department类中做什么才能在不违反封装原则的情况下向该列表添加对象

我现在在列表中看到的一个例子是:

class Department
{

     // ......
     List<Course> Courses = new List<Course>;
}
班级部门
{
// ......
列表课程=新列表;
}

但是,在类被实例化后,课程代码中没有Department.Courses(课程的所有其他属性都可用)。

至于你的第二个问题——没有一些代码或更多细节,这有点难——但我猜一下

您可能不是在实际创建列表,而是在声明它

List<xxxx> _variable;

vs

List<xxxx> _variable = new List<xxxxx>();
List\u变量;
vs
列表_变量=新列表();

您必须创建一个列表才能添加到其中(new list())

可能是类似的。有几种方法可以解决这个问题。这取决于你的要求

public class Department
{
    // Initialize the list inside Default Constructor
    public Department()
    {            courses = new List<Course>();        }

    // Initialize List By Declaring outside and Passing with Dpartment Initilization
    public Department(List<Course> _courses)
    {            courses = _courses;        }

    List<Course> courses;
    public List<Course> Courses
    {
        get
        {
            if (courses == null)
                return new List<Course>();
            else return courses;
        }
        set { courses = value; }
    }
    internal bool AddCourseToCourses(Course _course)
    {
        bool isAdded = false;
        // DoSomeChecks here like
        if (!courses.Contains(_course))
        {
            courses.Add(_course);
            isAdded = true;
        }
        return isAdded;
    }
}    

public class Course
{
    public Course(List<Subject> _subject)
    {            subjects = _subject;        }

    List<Subject> subjects;  
    public List<Subject> Subjects
    {
        get { return subjects; }
        set { subjects = value; }
    }
}

// I do not get what do you mean by course "section", very general.
// used Subject instead, Change as you want just to give an idea
public class Subject
{
    string name;    
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    int creditHours;    
    public int CreditHours
    {
        get { return creditHours; }
        set { creditHours = value; }
    }
    public Subject(string _name, int _creditHours)
    {
        name = _name;
        creditHours = _creditHours;
    }
}
public class TestClass
{
    public void DoSomething()
    {  
        // Subjects
        Subject subj1 = new Subject("C#", 10);
        Subject subj2 = new Subject(".Net", 10);

        // List of Subjects
        List<Subject> advancedPrSubjects = new List<Subject>();
        advancedPrSubjects.Add(subj1);
        advancedPrSubjects.Add(subj2);

        // Course
        Course advancedProgramming = new Course(advancedPrSubjects);            


        // Deliver authoroty to add Course to Department Class itself
        Department dept = new Department();
        dept.AddCourseToCourses(advancedProgramming);
    }
}
公共课部
{
//初始化默认构造函数中的列表
公共部门()
{courses=新列表();}
//通过在外部声明并使用Dpartment初始化传递来初始化列表
公共部门(课程表)
{课程=_课程;}
列出课程;
公开名单课程
{
得到
{
if(courses==null)
返回新列表();
其他返回课程;
}
设置{courses=value;}
}
内部bool AddCourseToCourses(课程)
{
bool isAdded=false;
//这里的支票怎么样
如果(!courses.Contains(_courses))
{
课程。添加(_课程);
isAdded=真;
}
添加了返回;
}
}    
公共课
{
公共课程(列出科目)
{subject=_subject;}
列出主题;
公开科目表
{
获取{返回主题;}
设置{subjects=value;}
}
}
//我不明白你所说的课程“部分”是什么意思,非常笼统。
//改为使用主题,根据您的想法进行更改
公共课科目
{
字符串名;
公共字符串名
{
获取{返回名称;}
设置{name=value;}
}
整数小时;
公共积分小时数
{
获取{return creditHours;}
设置{creditHours=value;}
}
公共主题(字符串名称,整数小时)
{
名称=_名称;
creditHours=_creditHours;
}
}
公共类TestClass
{
公共无效剂量测定法()
{  
//科目
受试者SubC1=新受试者(“C#”,10);
主题主题2=新主题(“.Net”,10);
//科目表
List advancedPrSubjects=新列表();
高级主题。添加(主题1);
高级主题。添加(主题2);
//课程
课程进阶编程=新课程(进阶主题);
//提交将课程添加到部门类本身的权限
部门=新部门();
部门附加课程(高级编程);
}
}
有更好的方法可以做到这一点。看看这些教程,以获得更好的洞察力

  • 希望能有帮助


你听起来好像在正确的轨道上。 你的第二个问题可以归结为很多事情。 可能正如Ruddy所说,您并没有创建列表。
也可能是您的课程列表不是公共的,或者您没有实例化要添加的新课程对象。

在类的无参数构造函数中实例化内部课程列表

private List<Course> _coursesList;

public Department()
{
    _coursesList = new List<Course>();
}
我认为在您的情况下,直接公开列表不是一个好主意,因为类列表可能提供诸如Add和Remove之类的方法,这可能会在父类上创建无效状态。因此,如果您选择像我建议的那样公开方法来操作内部集合,那么您可以向API客户机公开一个课程数组(记住这些数组是只读的),这样您的API使用者就不会对您的department类产生副作用

public Course[] Courses {
    get { return _coursesList.ToArray(); }
}
此外,还可以在Department类上实现IEnumerable接口。它将使您能够利用C#3.0中提供的所有LINQ扩展方法

我希望有帮助,
Carlos。

尝试将课程对象添加到列表时会出现什么错误?这将在每次访问课程对象时创建一个新列表。。。可能不是你所期望的,因为它从未保存回成员变量。Ruddy-我想我明白你的意思了…你对如何避免这种情况有什么建议吗?是的,在构建过程中删除空检查并实例化列表。当你控制状态时,没有理由使事情过于复杂。另外,您可能想要返回ICollection或IList,并且您可能想要一起摆脱setter。@andrew。取决于我认为的使用模型,但我猜您实际上可能不需要as“set”-只需要Get来返回courses成员变量,如果为null,则将其设置为new
Get{if(courses=null)courses=new List();return course;}
EDIT:我不确定
public Course[] Courses {
    get { return _coursesList.ToArray(); }
}