C#:List <of T>中的更新项值

All*_*ano 4 c# linq list

我正在寻找一种方法来更新列表中的元素,而不是自己枚举它.

我得到了包含名为Projects的List的Class MyProjects.

我想找到MyProjects.Projects-Class,其中Class1(Name)的成员属性等于Value"Overhead".

什么有效:

foreach (Project prj in MyProjects.Projects) {
    if (prj.Name == "Overhead")
        prj.IsActive = true;
}; 
Run Code Online (Sandbox Code Playgroud)

但是,我尝试使用Linq来做同样的事情,但是把它写成一行却失败了.这甚至可能吗?我不喜欢以上述方式进行迭代的原因是我已经迭代了这个代码块中的整个列表并认为可能有更美妙的方式:)

Jon*_*eet 14

你不应该试图把所有东西都归结为一行 - 就像可读的一样简短.在这种情况下,您可以使用:

foreach (var project in MyProjects.Projects.Where(p => p.Name == "Overhead"))
{
    project.IsActive = true;
}
Run Code Online (Sandbox Code Playgroud)

这是使用LINQ作为查询部分,这是LINQ的Q代表的.我强烈建议你不要像Mayank的回答那样改变LINQ调用中的项目.它容易出错(原始答案不起作用)并违背了LINQ的精神.

这是可读的,IMO.这不正是同样的事情的原代码,记住你-你无法避免的东西循环访问每个项目在列表中,如果每一个项目可能是要更新一个.

编辑:只是为了笑,如果你真的,真的想用非常简单的代码做,你可以使用:

// DON'T USE THIS!
MyProjects.Project.Count(p => p.Name == "Overhead" && (p.IsActive = true));
Run Code Online (Sandbox Code Playgroud)

这里我们使用&&短路的事实来避免评估赋值(p.IsActive = true),除非条件匹配.我们bool为一个属性赋值是很方便的,因为这意味着我们不需要做任何其他事情来使它成为&&运算符的有效第二个操作数.我们使用Count()完全评估结果而不创建任何其他列表等 - 我们使用带谓词的版本来避免甚至需要Where调用,这是以前的版本所做的.(LastOrDefault也会工作.)但这是一个可怕的滥用,并且不应该出现在任何真正的代码中.