1

私はほとんど問題ありません。私のコードの最初の方法では、学生に関するデータをtxtファイルからリストコレクションにロードしました。より多くの種類の学生があります(クラスPrimaryStudent、SecondaryStudent、HightSchoolStudent、UniversityStudent、ExternStudentなど)。今、他の方法で、あらゆる種類の学生を別のディレクトリに保存したいと思います。私の問題は、そのインターフェイスの1つのコレクションにすべてのオブジェクトがあることです。どうすれば差別化できますか、またはすべてのタイプの学生を差別化するにはどうすればよいですか?助けてください。

4

3 に答える 3

2

リストが一般的なものである場合、つまりList<Student>次のことができます。

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

リストが一般的でない場合は、次のように分離できます。

foreach(var s in myStudentList)
{
  if(s is PrimaryStudent)
  { 

    // add to PrimaryStudents list
  }
  else if(s is SecondaryStudent)
  {

    ...
  }
}
于 2012-05-05T17:09:46.730 に答える
1

C#のisキーワードを見てください。

例:

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();

出力:

This was a PrimaryStudent
This was a SecondaryStudent
This was a HightSchoolStudent
于 2012-05-05T17:14:13.457 に答える
1

最初にコレクションからすべての生徒のタイプを取得してから、タイプごとに最終的な場所に保存できます。ここで紹介するソリューションでは、isまたはOfType <> LINQメソッドを使用していません。これは、Student、PrimaryStudents、SecondaryStudentsを異なるフォルダーに格納する場合、これらの演算子が正しく機能しないためです。

つまり、基本クラスのインスタンスを異なる方法で処理する場合(たとえば、別のフォルダーに保存する場合)、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
于 2012-05-05T17:16:56.470 に答える