Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将对象转换为右类型_C#_.net_Oop_Class_Interface - Fatal编程技术网

C# 将对象转换为右类型

C# 将对象转换为右类型,c#,.net,oop,class,interface,C#,.net,Oop,Class,Interface,我没什么问题。 在代码的第一个方法中,我将学生的数据从txt文件加载到列表集合。学生班类型较多,有小学生、中学生、高中生、大学生、课外生等。。。 现在,在另一种方法中,我想将每一种学生保存到不同的目录中。我的问题在于,我在该接口的一个集合中拥有所有对象。现在我该如何区分或应该如何区分所有类型的学生?请提供帮助。如果您的列表是通用的,即列表,您可以执行以下操作: List<PrimaryStudent> primaryStudents = myStudentList.OfType<

我没什么问题。 在代码的第一个方法中,我将学生的数据从txt文件加载到列表集合。学生班类型较多,有小学生、中学生、高中生、大学生、课外生等。。。
现在,在另一种方法中,我想将每一种学生保存到不同的目录中。我的问题在于,我在该接口的一个集合中拥有所有对象。现在我该如何区分或应该如何区分所有类型的学生?请提供帮助。

如果您的列表是通用的,即列表,您可以执行以下操作:

List<PrimaryStudent> primaryStudents = myStudentList.OfType<PrimaryStudent>().ToList();

如果您的列表是通用的,即列表,您可以执行以下操作:

List<PrimaryStudent> primaryStudents = myStudentList.OfType<PrimaryStudent>().ToList();
请看一下c中的

例如:

List<IStudent> students = new List<IStudent>();

students.Add(new PrimaryStudent());
students.Add(new SecondaryStudent());
students.Add(new HightSchoolStudent());

foreach (IStudent student in students)
{
    if (student is PrimaryStudent)
    {
        Console.WriteLine("This was a PrimaryStudent");
    }
    else if (student is SecondaryStudent)
    {
        Console.WriteLine("This was a SecondaryStudent");
    }
    else if (student is HightSchoolStudent)
    {
        Console.WriteLine("This was a HightSchoolStudent");
    }
}

Console.Read();
请看一下c中的

例如:

List<IStudent> students = new List<IStudent>();

students.Add(new PrimaryStudent());
students.Add(new SecondaryStudent());
students.Add(new HightSchoolStudent());

foreach (IStudent student in students)
{
    if (student is PrimaryStudent)
    {
        Console.WriteLine("This was a PrimaryStudent");
    }
    else if (student is SecondaryStudent)
    {
        Console.WriteLine("This was a SecondaryStudent");
    }
    else if (student is HightSchoolStudent)
    {
        Console.WriteLine("This was a HightSchoolStudent");
    }
}

Console.Read();

您可以首先从集合中获取所有学生类型,然后按类型将其保存到最终位置。这里介绍的解决方案没有使用is或OfType LINQ方法,因为如果要将学生、初级学生和次级学生存储在不同的文件夹中,这些运算符确实无法正常工作

换句话说,如果您想不同地处理基类的实例,例如保存到不同的文件夹,您需要放弃OfType和is运算符,但直接检查类型

class Student { }
class PrimaryStudent : Student { }
class SecondaryStudent : Student { }

private void Run()
{
    var students = new List<Student> { new PrimaryStudent(), new PrimaryStudent(), new SecondaryStudent(), new Student() };
    Save(@"C:\University", students);
}

private void Save(string basePath, List<Student> students)
{
    foreach (var groupByType in students.ToLookup(s=>s.GetType()))
    {
        var studentsOfType = groupByType.Key;
        string path = Path.Combine(basePath, studentsOfType.Name);
        Console.WriteLine("Saving {0} students of type {1} to {2}", groupByType.Count(), studentsOfType.Name, path);
    }

}

Saving 2 students of type PrimaryStudent to C:\University\PrimaryStudent
Saving 1 students of type SecondaryStudent to C:\University\SecondaryStudent
Saving 1 students of type Student to C:\University\Student

您可以首先从集合中获取所有学生类型,然后按类型将其保存到最终位置。这里介绍的解决方案没有使用is或OfType LINQ方法,因为如果要将学生、初级学生和次级学生存储在不同的文件夹中,这些运算符确实无法正常工作

换句话说,如果您想不同地处理基类的实例,例如保存到不同的文件夹,您需要放弃OfType和is运算符,但直接检查类型

class Student { }
class PrimaryStudent : Student { }
class SecondaryStudent : Student { }

private void Run()
{
    var students = new List<Student> { new PrimaryStudent(), new PrimaryStudent(), new SecondaryStudent(), new Student() };
    Save(@"C:\University", students);
}

private void Save(string basePath, List<Student> students)
{
    foreach (var groupByType in students.ToLookup(s=>s.GetType()))
    {
        var studentsOfType = groupByType.Key;
        string path = Path.Combine(basePath, studentsOfType.Name);
        Console.WriteLine("Saving {0} students of type {1} to {2}", groupByType.Count(), studentsOfType.Name, path);
    }

}

Saving 2 students of type PrimaryStudent to C:\University\PrimaryStudent
Saving 1 students of type SecondaryStudent to C:\University\SecondaryStudent
Saving 1 students of type Student to C:\University\Student

您使用的是通用列表吗?Down是我要查找的解决方案。您使用的是通用列表吗?Down是我要查找的解决方案。如果要存储普通学生,则OfType不起作用,因为OfType将不仅返回学生,还返回小学和中学学生。OfType LINQ运算符也存在同样的问题。请看下面我的解决方案,如何以安全的方式执行此操作。如果您还想存储普通学生,则OfType不起作用,因为OfType不仅会返回学生,还会返回小学生和中学生。OfType LINQ运算符也存在同样的问题。请看我下面的解决方案,看看如何以安全的方式完成此操作。is关键字仅在您不想存储普通学生(中小学生的基类)时有效。如果您将if语句放在所有其他if语句的下面,则会有效。这是真的,但此代码很难维护和扩展。我不想每次都为新的学生类型编写额外的代码。我的通用解决方案不需要知道存在哪些学生类型。它只是按类型对它们进行分组。is关键字仅在您不想存储普通学生(中小学生的基类)时才起作用。如果您将if语句放在所有其他if语句下面,则会起作用。这是事实,但此代码很难维护和扩展。我不想每次都为新的学生类型编写额外的代码。我的通用解决方案不需要知道存在哪些学生类型。它只是按类型对它们进行分组。