【问题标题】:C#: is there a way to set a property of objects in a collection using lambda expression?C#:有没有办法使用 lambda 表达式设置集合中对象的属性?
【发布时间】:2011-03-02 23:48:01
【问题描述】:

我正在开发一个小项目,我想我可以尝试一些我不知道的东西,这样我就可以学习一些新东西。 我有一个消息集合,称为 msgs。我想只过滤未读的,然后将其设置为“已读”。 为此,我用这个 lambda 表达式调用了 Where 方法,我想我会得到一个所有未读消息的列表。现在我想将值设置为“Read”(将“T”分配给 MessageRead 属性)。有没有办法使用 lambda 表达式来做到这一点?

我得到了这段代码,但“All”方法不是我想要的,我刚刚发现它会检查列表中的所有元素是否都符合这个条件。

msgs.Where(message => message.MessageRead == 'F').All(message => message.MessageRead = 'T');

非常感谢, 奥斯卡

【问题讨论】:

    标签: c# .net lambda


    【解决方案1】:

    您所追求的是 ForEach 扩展方法,请参阅此处的讨论:LINQ equivalent of foreach for IEnumerable<T>

    【讨论】:

    • 太棒了!谢谢你的帮助!你太快了,我要等10分钟才能接受你的回答,如果可以的话,我会尽快标记它!
    【解决方案2】:

    事实上,如果有这样的方法,它不会比常规的 foreach 语句有任何好处。

    Eric Lippert(微软高级软件设计工程师)对这个主题有很好的概述:“foreach” vs “ForEach”

    【讨论】:

    • 是的,我知道。在这种情况下,我不是因为它更好,而是因为我想学习它。 :)
    【解决方案3】:

    foreach 语句有什么问题?它完全满足您的需求:

    foreach (var msg in msgs.Where(m => m.MessageRead == 'F'))
    {
        msg.MessageRead = 'T';
    }
    

    【讨论】:

    • 是的,确实如此。但问题是我已经知道这个了。我想学习新东西,以便在需要时能够使用它们;)
    • @Oscar:很公平,尽管学习过程的一部分是发现在不同场景中合适的技术是什么。 “如何用手机打开啤酒瓶?”的正确答案几乎总是“不要使用手机;使用开瓶器”。
    • 嗨!这是真的,但我认为我们可以在不一定需要它们但我们有时间/机会这样做的时候学习一些东西,所以在未来,如果我们需要它,我们已经知道了。 Nodoby 知道,也许在某个时间点,只剩下一部手机和一瓶 :)
    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 2011-06-02
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2021-11-25
    • 2010-12-17
    相关资源
    最近更新 更多