如何在foreach之外初始化var

本文关键字:初始化 var foreach | 更新日期: 2023-09-27 18:04:15

我想在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循环外初始化courseinfo ?我尝试用null初始化给我错误!

如何在foreach之外初始化var

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

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

这将创建一个Dictionary<string, List<Course>。这与下面的代码几乎相同,除了它映射了学期。名称作为密钥。当然,这意味着你必须有唯一的学期名,否则字典无法创建。


每次在foreach中循环时都要重新初始化courseinfo,因此只会得到最后一个学期id的列表。

你可以写一个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>>

答案是:

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的最终迭代之外,您正在丢弃所有内容。这就是你想要做的吗?

为什么不用第一个学期初始化courseInfo的第一个实例,然后迭代遍历学期,有什么原因需要在foreeach之前初始化courseInfo吗?

可能对此有所帮助。在每次迭代中收集课程信息

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