gpt4 book ai didi

C#:更新 List 中的项目值

转载 作者:太空狗 更新时间:2023-10-30 00:14:07 24 4
gpt4 key购买 nike

我正在寻找一种无需自行枚举即可更新列表中的元素的方法。

我得到了 MyProjects 类,它包含一个名为 Projects 的列表。

我想找到 MyProjects.Projects-Class,其中 Class1(名称)的成员属性等于值“开销”。

什么有效:

foreach (Project prj in MyProjects.Projects) {
if (prj.Name == "Overhead")
prj.IsActive = true;
};

然而,我尝试使用 Linq 来做同样的事情,但未能将其写成一行。这可能吗?我不喜欢用上面的方式迭代的原因是我已经在这个代码块中迭代了整个列表并且认为可能有更漂亮的方式:)

最佳答案

您不应该试图将所有内容都写成一行 - 尽可能简洁易读。在这种情况下,您可以使用:

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

那是将 LINQ 用于查询部分,这很合适,因为这就是 LINQ 的 Q 所代表的意思。我强烈建议您不要像 Mayank 的回答那样改变 LINQ 调用中的项目。它容易出错(正如原始答案不起作用所证明的那样)并且违背了 LINQ 的精神。

在我看来,它的可读性差不多。请注意,它与原始代码的作用完全相同 - 如果每一项 可能 都是您想要的,则您无法避免 某些 遍历列表中的每一项更新。

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

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

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

关于C#:更新 List<of T> 中的项目值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32993562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com