2011-08-01 60 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(); 
    } 

如何初始化courseInfos出方的foreach循環?我嘗試用null初始化給我錯誤!

+0

你究竟想用這段代碼實現什麼? –

+0

你不在循環中使用'sm' - 爲什麼? – Vlad

+0

我用sm編輯了我的代碼。 – Hardcode

回答

0

編輯:

如果你想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()) 

這將創建一個Dictionary<string, List<Course>這幾乎等同於下面的代碼,不同之處在於它的semester.Name映射作爲鍵。這當然意味着你必須有獨特的學期名稱,否則字典不能創建。


您每次重新初始化courseInfos您在foreach循環中,所以你只會得到最後semesterId的列表。

你可以寫一個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<Course>和展平爲一個序列,而不是IEnumerable<IEnumerable<Course>>

+0

如果我想輸出課程和學期實體,返回類型是什麼? – Hardcode

+0

你是什麼意思?你的意思是把每個課程映射到單個學期嗎? –

+0

那麼我有學期 - >課程一對多的關係。例如,我想返回courseName和SemesterName。我的退貨類型是列表。什麼將返回類型retrun 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

答案是:

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

但是,你放棄一切,但foreach的最後一次迭代。這是你的意思嗎?

0

爲什麼不只是初始化第一學期courseInfo的第一個實例,然後迭代學期,是否有一個原因需要在foreeach之前初始化courseInfo?

0

可能是這樣的幫助。在每次迭代中收集課程信息。

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; 
     }