2011-08-01 13 views
-1

foreachループの外側でvarを初期化したいとします。ここでforeach以外でvarを初期化する方法

は私のコードです:

public List<Course> GetCourse() 
    { 
     IList<Semester> semesters = Semester.Get();  

     foreach (Semester sm in semesters) 
     { 
      IList<CourseInstance> courseInstances = CourseInstance.Get(sm[0].SemesterId); 
      var courseInfos = from c in courseInstances 
            select new Course { Code = c.Course.Code, Name = c.Course.Name }; 
     } 

     return courseInfos.ToList(); 
    } 

私は、foreachループを左右からcourseInfosを初期化するにはどうすればよいですか? nullで初期化しようとするとエラーが出る!

+0

このコードでは、どのようなことを達成しようとしていますか? –

+0

あなたはループ内で 'sm'を使用していません - なぜですか? – Vlad

+0

私はsmで自分のコードを編集しました。 – Hardcode

答えて

0

EDIT:あなたはコースのリストにSemesterNameをマッピングする場合

、私は辞書をお勧めします。

semesters.ToDictionary(semester => semester.Name, semester => 
         semesters.SelectMany(sid => 
             CourseInstance.Get(sid.SemesterId)) 
         .Select(c => new Course 
         {Code = c.Course.Code, Name = c.Course.Name}).ToList()) 

これは、これはそれがキーとしてsemester.Nameをマップすることを除いて、以下のコードとほぼ同じですDictionary<string, List<Course>を作成します。これは、もちろん、独自の学期名を持たなければならないことを意味します。そうでなければ、辞書を作成することはできません。


あなたはcourseInfosにforeachの中にあなたのループするたびに再初期化されているので、あなたは、最後semesterIdのリストを取得します。

これをすべて1行で行うlinqクエリを記述することができます。

return semesters.SelectMany(sid => CourseInstance.Get(sid.SemesterId)) 
          .Select(c => new Course { Code = c.Course.Code, 
              Name = c.Course.Name }).ToList() 

それを打破するには、

.SelectMany(sid => CourseInstance.Get(sid.SemesterId)) 

はforeachのと同じことを行います。それはIEnumerable<CourseInstance>を返します。その後

、あなたは私たちが最後のセクションで得た結果に

.Select(c => new Course { Code = c.Course.Code, Name = c.Course.Name }) 

を呼んでいます。リストに変換するIEnumerable<Course>を返します。

SelectManyは、それがこのヘルプかもしれIEnumerable<IEnumerable<Course>>

+0

CourseとSemesterエンティティを出力したい場合の戻り値のタイプは何ですか? – Hardcode

+0

どういう意味ですか?各コースを個々の学期に対応させることを意味しますか? –

+0

まあ、私はセメスターを持っています - >コース1対多の関係。たとえば、courseNameとSemesterNameを返したいとします。返品タイプはリストです。 CourseNameとSemesterNameを返す戻り値の型は何ですか? – Hardcode

1

varは、初期化する値の型を推定します。したがって、nullで初期化することはできません。それ以外はすべて。

私はあなたが欲しいのLINQ文が

var courses = semesters 
    .SelectMany(s => CourseInstance.Get(s.SemesterId) 
    .Select(c => new Course (Code = c.Course.Code, Name = c.Course.Name)) 
    .ToList(); 
+0

あなたのコードに間違いがあります。エラー:タイプ[Semester]の式に[]を使用したインデックス付けを適用できません – Hardcode

+0

コードでは、ループ内のvarコースがある場合、どのようにセミナーをループしますか? – Hardcode

+0

[0]は必要ありません。最初のクラスだけでなく、すべてのクラスにループしたいと思います。 – Aidan

0

答えがあると信じている。しかし、あなたはforeachの最後の繰り返し以外のすべてを

IEnumerable<Course> courseInfos = null; 

foreach (Semester sm in semesters) 
{ 
    IList<CourseInstance> courseInstances = CourseInstance.Get(semesters[0].SemesterId); 
    courseInfos = from c in courseInstances 
        select new Course { Code = c.Course.Code, Name = c.Course.Name }; 
} 
return courseInfos.ToList(); 

廃棄されています。これはあなたがやるべきことですか?

0

最初の学期でcourseInfoの最初のインスタンスを初期化してからSemestersで繰り返し処理するのではなく、それ以前にcourseInfoを初期化する必要があるのはなぜですか?

0

するのではなく、1つのシーケンスにそれを各IEnumerable<Course>を取り、平らになる以外を選択することが似ています。各反復でコース情報を収集します。

public List<Course> GetCourse() 
     { 
     IList<Semester> semesters = Semester.Get(); 

     List<Course> courseInfos = new List<Course>(); 
     foreach (Semester sm in semesters) 
      { 
      IList<CourseInstance> courseInstances = CourseInstance.Get(sm.SemesterId); 
      IEnumerable<Course> result = from c in courseInstances 
           select new Course { Code = c.Course.Code , Name = c.Course.Name }; 
      courseInfos.AddRange(result); 
      } 

     return courseInfos; 
     }