加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#:更新列表中的项目值

发布时间:2020-12-15 23:46:58 所属栏目:百科 来源:网络整理
导读:我正在寻找一种方法来更新列表中的元素,而不是自己枚举它. 我得到了包含名为Projects的List的Class MyProjects. 我想找到MyProjects.Projects-Class,其中Class1(Name)的成员属性等于Value“Overhead”. 什么有效: foreach (Project prj in MyProjects.Proje
我正在寻找一种方法来更新列表中的元素,而不是自己枚举它.

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

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

什么有效:

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的精神.

这是可读的,IMO.它与原始代码完全相同,请注意 – 如果每个项目都可能是您要更新的项目,则无法避免迭代列表中每个项目的内容.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读