【问题标题】:Using Array of Arrays for One to Many Relationship in C#在 C# 中将数组数组用于一对多关系
【发布时间】:2015-04-09 15:40:30
【问题描述】:

我正在使用 C# 进行控制台测试。

其实我从来没有使用过 C#,而是 VB.Net。我想为一对多关系创建数组。

我的一个是“学生”,有“姓名”、“性别”、...、“所学课程”。

一个学生会参加很多课程,每门课程都有一个标题和包含的主题。每个主题都有名称、描述和要点。

像这样。

Student
- Name   - Sex   - Courses Taken

Take Courses
- Course Title   - Subject Included

Subject
- Subject Name             [Math]       [MVC]
- Subject description      [Advance]    [Building Website]
- Subject Point            [6.9]        [5.6]

我想将每个实体存储在数组中,但我不知道如何将科目/课程连接到每个学生。以及如何获得参加数学或 MVC 的学生。因为每个学生都可以有更多的课程/不止一门科目。

【问题讨论】:

  • 必须是数组吗?你能用其他数据结构吗?
  • 是的。其他结构如列表是好的。 List Course = new List() { new arrCourse{Name="Math",Description="Advance Math1",Point=6.5}, new arrCourse{Name="Using MVC .Net for Website",Description ="开始 MVC",Point=6.5}, };
  • 冒着听起来不具建设性的风险,C# 确实不是您想要执行此操作的语言。这看起来像是 SQL 服务器的工作。

标签: c# arrays list search match


【解决方案1】:

您需要创建类来描述您的不同对象。

class Student
{
   string Name { get; set; }
   Gender Sex { get; set; } // write an enum for this
   IEnumerable<Course> CoursesTaken { get; set; }
}

class Course
{
   string Title { get; set; }
   Subject Subject { get; set; }
}

class Subject
{
   string Name { get; set; }
   string Description { get; set; }
   double Points { get; set; }
}

使用List 创建这些新类型的实例的枚举允许您使用 LINQ 选择或评估列表的成员(嵌套 for 循环也可以):

// populate a list of students called studentList
//...
// use LINQ to select the students you want
var mathResults = studentList.Where(student => student.CoursesTaken.Any(course => course.Subject.Name == "Math"));

【讨论】:

  • 您甚至可以使用实体框架从您的类模型中构建一个数据库,并在其中进行选择,它所属的位置:)
  • 非常感谢!每个字都有帮助!
  • @Nai 没问题。如果此答案最有帮助,请将此答案标记为正确。
【解决方案2】:

我觉得我做得很好... 请检查我的代码以了解我的问题! ^^ 我首先做了3个类如下..

class Students
    {
        public string StudentName;
        public int StudSize;
        public bool StudSex;
        public List<Take_Courses> tcourses;
        public Students() { }
        public Students(string name, int size, bool sex, List<Take_Courses> tcourses)
        {
            StudentName = name;
            StudSize = size;
            StudSex = sex;
            this.tcourses = tcourses;
        }
}

class Take_Courses
    {
        public string classname;
        public List<Arr_Courses> arr_Course;
        public Take_Courses() { }
       public Take_Courses(string classname, List<Arr_Courses> arr_courses)
        {
            this.classname = classname;
            arr_Course = arr_courses;
        }
    }

class Arr_Courses
    {
        public string cosname;
        public string cosdesc;
        public float cospoint;
        public Arr_Courses() { }
        public Arr_Courses(string name, string description, float point)
        {
            cosname = name;
            cosdesc = description;
            cospoint = point;
        }
    }

然后我在 Main 类中初始化值如下;

Arr_Courses acos=new Arr_Courses();
Arr_Courses acos1=new Arr_Courses("Math","Advance Math1",9.5f);

Take_Courses cos=new Take_Courses();
Take_Courses cos_take1=new Take_Courses("Info Tech",new List<Arr_Courses>{acos1});


Students stu=new Students();
Students Stu1 = new Students("Milla", 22, true,new List<Take_Courses>{cos_take1});

然后我制作另一个列表来生成学生的姓名并用于循环并将每个列表分配给列表。

我认为一些重要的部分是这个。

  if (arr_stud[i].tcourses[j].arr_Course[k].cosname.Equals("Math"))
    {
         Math_Stud++;
         MathStudents[i] = arr_stud[i];
    }

如果有人需要这样的东西,我会分享这个。欢迎分享任何未分级的代码。非常感谢。

【讨论】:

  • 在命名类时避免使用上下文。 Taken_Courses 可以被实例化为 Taken_Courses availableCourses = new Taken_Courses() 这很容易混淆;更好的是Course,所以你可以有Course availableCourse, takenCourse(你的类名也应该是单数,除非它们真的代表多个对象)。
  • 您也可能不需要Arr_Courses 中的Arr_Courses 中的List Taken_Courses(我假设Arr_Courses 代表课程的主题,你应该直接称它为Subject)因为每门课程只有一个科目。这样您就可以减少一个 for 循环。
  • 最后,LINQ 的效率只比最优化的for 循环略低,但更容易理解。请参阅我对使用 LINQ 的 Select 查询的回答。
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2012-04-01
相关资源
最近更新 更多