如何在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初始化给我错误!
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;
}