You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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);
    }
}

核心逻辑说明

两种写法的思路完全一致:

  1. 先定位到用户选中的Cafedra对象
  2. 从教研室的Specializations集合(专业ID列表)中,匹配对应的Specialization实体
  3. 通过SelectMany(或查询表达式的第二个from)把每个专业的课程ID数组展开为单个ID项
  4. 将课程ID字符串转为整数,再从Disciplinas集合中取出对应的课程对象
  5. 最后遍历输出课程名称(如果存在同一课程被多个专业关联的情况,加上Distinct()即可实现去重)

修改后的代码比原多层循环更简洁,逻辑也更直观清晰。

内容的提问来源于stack exchange,提问作者SuxoiKorm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:14:40