我想在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 :(得分: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;
}