如何用LINQ实现选择指定Cafedra下的所有Disciplina
用LINQ替代多层循环获取指定教研室下的所有课程
先明确你的三个实体类结构(方便后续参考):
public class Disciplina { public int Key { get; set; } public string Name { get; set; } public string[] Semestr { get; set; } public int Time { get; set; } public List<int> TimeToAll { get; set; } public string Otchetnost { get; set; } public int Specialnost { get; set; } // ...其他属性 } public class Cafedra { public int Key { get; set; } public string Name { get; set; } public string Facultet { get; set; } public string Telefone { get; set; } public List<int> Specializations { get; set; } // ...其他属性 } public class Specialization { public int Key { get; set; } public string Name { get; set; } public string SpecialName { get; set; } public string FormaObuch { get; set; } public string[] DisplinsID { get; set; } // ...其他属性 }
你的现有实现通过三层循环关联教研室、专业和课程,用LINQ可以把这些逻辑整合得更简洁易读。这里提供两种常见的LINQ写法:
链式调用写法
private static void DiscipliniCafedri() { Console.WriteLine("Выберите кафедру:"); for (int i = 0; i < Cafedras.Count; i++) { Console.WriteLine(i + 1 + " " + Cafedras[i].ToString()); } int ID = Convert.ToInt32(Console.ReadLine()); Console.Clear(); Console.WriteLine("Дисциплины выбранной кафедры:"); // 获取选中的教研室 var selectedCafedra = Cafedras[ID - 1]; // 用LINQ链式查询获取所有关联课程 var disciplinasOfCafedra = selectedCafedra.Specializations // 把教研室的专业ID转换成对应的Specialization对象 .Select(specId => Specializations[specId - 1]) // 把每个专业的课程ID集合展开成单个ID .SelectMany(spec => spec.DisplinsID) // 把课程ID转换成对应的Disciplina对象 .Select(disciplinaId => Disciplinas[Convert.ToInt32(disciplinaId) - 1]) // 可选:如果同一个课程可能被多个专业关联,这里可以加Distinct()去重 .Distinct(); // 遍历输出课程名称 foreach (var disciplina in disciplinasOfCafedra) { Console.WriteLine(disciplina.Name); } }
查询表达式写法(更接近SQL语法)
如果你习惯SQL风格的写法,也可以用LINQ查询表达式:
private static void DiscipliniCafedri() { Console.WriteLine("Выберите кафедру:"); for (int i = 0; i < Cafedras.Count; i++) { Console.WriteLine(i + 1 + " " + Cafedras[i].ToString()); } int ID = Convert.ToInt32(Console.ReadLine()); Console.Clear(); Console.WriteLine("Дисциплины выбранной кафедры:"); var selectedCafedra = Cafedras[ID - 1]; var disciplinasOfCafedra = from specId in selectedCafedra.Specializations let spec = Specializations[specId - 1] from disciplinaIdStr in spec.DisplinsID let disciplinaId = Convert.ToInt32(disciplinaIdStr) select Disciplinas[disciplinaId - 1]; // 同样可选去重 // disciplinasOfCafedra = disciplinasOfCafedra.Distinct(); foreach (var disciplina in disciplinasOfCafedra) { Console.WriteLine(disciplina.Name); } }
核心逻辑说明
两种写法的思路完全一致:
- 先定位到用户选中的
Cafedra对象 - 从教研室的
Specializations集合(专业ID列表)中,匹配对应的Specialization实体 - 通过
SelectMany(或查询表达式的第二个from)把每个专业的课程ID数组展开为单个ID项 - 将课程ID字符串转为整数,再从
Disciplinas集合中取出对应的课程对象 - 最后遍历输出课程名称(如果存在同一课程被多个专业关联的情况,加上
Distinct()即可实现去重)
修改后的代码比原多层循环更简洁,逻辑也更直观清晰。
内容的提问来源于stack exchange,提问作者SuxoiKorm
相关产品推荐
相关产品推荐

