如何在foreach之外初始化var

时间:2011-08-01 16:09:54

标签: c# list initialization 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初始化给我错误!

5 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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的最后一次迭代之外,您正在丢弃所有内容。这是你的意思吗?

答案 2 :(得分:0)

为什么不在第一个学期初始化courseInfo的第一个实例,然后迭代Semesters,是否有理由需要在foreeach之前初始化courseInfo?

答案 3 :(得分: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映射为键。当然,这意味着您必须拥有唯一的学期名称,否则无法创建字典。


每次循环使用foreach时,您都在重新初始化courseInfos,因此您只能获得最后一个学期的列表。

您可以编写一个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与Select的工作方式类似,不同之处在于它会将每个IEnumerable<Course>展平为一个序列,而不是IEnumerable<IEnumerable<Course>>

答案 4 :(得分: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;
        }