C# 如何将多个嵌套foreach组合到on-Linq查询中

C# 如何将多个嵌套foreach组合到on-Linq查询中,c#,linq,foreach,C#,Linq,Foreach,我不熟悉linq查询。是否有一种方法可以将这些嵌套的foreachs组合到一个linq查询中 如果没有,在这种情况下是否有更好的更新方法 多谢各位 List<Student> StudentList = new List<Student>(); List<int> IDsList = new List<int>(); foreach (var id in IDsList) { foreach (

我不熟悉
linq
查询。是否有一种方法可以将这些嵌套的
foreach
s组合到一个
linq
查询中

如果没有,在这种情况下是否有更好的更新方法

多谢各位

    List<Student> StudentList = new List<Student>();
    List<int> IDsList = new List<int>();


    foreach (var id in IDsList)
    {

        foreach (var st in StudentList.Where(a => a.StudentID == id))
        {
            foreach (var cr in st.Courses)
            {
                cr.Projects.Where(b => string.IsNullOrEmpty(b.ProjectName) == true).ToList().ForEach(c => c.ProjectName = "Dummy");

            }
        }

    }




public class Student
{
    public string FirstName { get; set; }
    public int StudentID { get; set; }
    public List<course> Courses { get; set; }

}

public class course
{
    public int CourseID { get; set; }
    public string Description { get; set; }
    public List<CourseProjects> Projects { get; set; }
}

public class CourseProjects
{
    public string ProjectName { get; set; }
    public int ProjectID { get; set; }

}
List StudentList=newlist();
List IDsList=新列表();
foreach(IDsList中的变量id)
{
foreach(StudentList.Where中的var st(a=>a.StudentID==id))
{
foreach(圣课程中的var cr)
{
其中(b=>string.IsNullOrEmpty(b.ProjectName)==true.ToList().ForEach(c=>c.ProjectName=“Dummy”);
}
}
}
公立班学生
{
公共字符串名{get;set;}
公共int StudentID{get;set;}
公共列表课程{get;set;}
}
公共课
{
public int CourseID{get;set;}
公共字符串说明{get;set;}
公共列表项目{get;set;}
}
公共课程计划
{
公共字符串ProjectName{get;set;}
公共int ProjectID{get;set;}
}

您可以将每个嵌套的foreach替换为selectMany

  StudentList.Where(s => IDsList.Contains(s.StudentID)).SelectMany(f => f.Courses).SelectMany(p => p.Projects).Where(b => string.IsNullOrEmpty(b.ProjectName)).ToList().
            ForEach(c => c.ProjectName = "Dummy");

is是否真的是更新列表的更好方法仍有争议。

您可以用selectMany替换每个嵌套的foreach

  StudentList.Where(s => IDsList.Contains(s.StudentID)).SelectMany(f => f.Courses).SelectMany(p => p.Projects).Where(b => string.IsNullOrEmpty(b.ProjectName)).ToList().
            ForEach(c => c.ProjectName = "Dummy");

is是否真的是更新列表的更好方法仍有争议。

您使用Linq
ForEach
表明您知道如何实现这一点的基本知识,但在不无法阅读您所写内容和理解/确保其逻辑是您试图实现的逻辑的情况下,正在努力应用它。这表明您不应该使用一系列的
ForEach
lambdas,因为人类的易读性在编程中与执行一样重要。如果你不能阅读你写的东西,你应该假设下一个看到你的代码的人也不会。你使用Linq
ForEach
表明你知道如何做到这一点的基本知识,但在不无法阅读你写的东西的情况下努力应用它,并理解/确保它的逻辑是你想要达到的。这表明您不应该使用一系列的
ForEach
lambdas,因为人类的易读性在编程中与执行一样重要。如果你不能阅读你写的东西,你应该假设下一个看到你的代码的人也看不到。最好用
IDsList
HashSet
,而不是
List
。如果不具体化,这不会崩溃吗?因为您在枚举过程中编辑项目名称。@user6144226否。我们没有更改正在枚举的集合的内容,我们正在更改正在枚举的内容的属性。@Evk是的,在大多数情况下,使用哈希集可能会执行得更好,尤其是当任一列表较大时。@RobertMcKee谢谢,它让我思考,因为属性在Where子句中,我猜这没问题,因为迭代只是向前的?最好是使
IDsList
哈希集
而不是
列表
。如果不具体化,这个会崩溃吗?因为您在枚举过程中编辑项目名称。@user6144226否。我们没有更改正在枚举的集合的内容,我们正在更改正在枚举的内容的属性。@Evk是的,在大多数情况下,使用哈希集可能会执行得更好,尤其是当任一列表较大时。@RobertMcKee谢谢,它让我思考,因为属性在Where子句中,我猜这没关系,因为迭代只是向前的?