2012-05-05 6 views
1

私は少し問題があります。 私のコードの最初のメソッドでは、txtファイルの学生に関するデータをListコレクションにロードしました。もっと多くのタイプの学生がいます(PrimaryStudent、SecondaryStudent、HightSchoolStudent、UniversityStudent、ExternStudentなど...) 他の方法では、すべての種類の学生を別のディレクトリに保存します。私の問題は、そのインタフェース内のすべてのオブジェクトが1つのコレクションに含まれていることです。どのように差別化することができますか、どのようにしてすべてのタイプの生徒を区別することができますか?助けてください。あなたのリストがジェネリックである場合、すなわちList<Student>あなたが次のことを行うことができオブジェクトを右のタイプに変換する

+0

genericリストを使用していますか? –

+0

はい。私はそれを通常使っています。 – user35443

+0

ダウンは私が探していた解決策です。 – user35443

答えて

2

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) 
    { 

    ... 
    } 
} 
+0

OfType は生徒だけでなく、プライマリおよびセカンダリスチューデントも返すので、通常の生徒も保存したい場合は、OfTypeは機能しません。 OfType LINQ演算子も同じ問題を共有します。これを安全な方法でどうやって行うのか、私の解決策を見てください。 –

1

はを見てくださいC#のis keyword

例:

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 
+0

isキーワードは、小学生や中学生の基本クラスである通常の生徒を保存したくない場合にのみ機能します。 –

+0

if文を他のすべてのif文の下に置くとうまくいくでしょう。 – GameScripting

+0

これは当てはまりますが、このコードは維持して拡張するのが難しいでしょう。私は毎回新しい学生タイプのための特別なコードを書いてはいけません。私の一般的な解決策は、どの学生の種類が存在するかを知る必要はありません。単にタイプ別にグループ化します。 –

1

あなたが最初のコレクションからすべての生徒のタイプを取得し、その最終的な場所にタイプすることによって、それらを保存することができます。 Students、PrimaryStudents、およびSecondaryStudentsを異なるフォルダに保存する場合、これらの演算子が正しく機能しないため、ここに示した解決策では、OfまたはOfType <> LINQメソッドを使用しません。

つまり、ベースクラスのインスタンスを別々に扱いたい場合(たとえばdifferntフォルダに保存する場合)、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 
関連する問題