【问题标题】:How to replace values smaller than zero with zero in a collection using LINQ如何使用 LINQ 将集合中小于零的值替换为零
【发布时间】:2021-05-28 11:34:33
【问题描述】:

我有一个对象列表。该对象有一个名为 val 的字段。此值不应小于零,但此列表中有此类对象。我想用零替换那些小于零的值。最简单的解决方案是

foreach(Obj item in list)
{
    if (item.val < 0)
    {
        item.val = 0;
    }
}

但我想使用 LINQ 来执行此操作。重要的是我不想要更新元素的列表。我想要相同的列表,只是替换了必要的值。提前致谢。

【问题讨论】:

  • 这能回答你的问题吗? LINQ equivalent of foreach for IEnumerable<T>
  • LINQ 查询,它不会修改任何内容。您可以使用Where(it=&gt;it.val&lt;0) 来检索具有负值的项目,但仍然需要在循环中进行修改
  • 要求“使用 LINQ”从何而来,为什么?
  • 顺便说一句,您现在拥有的一切都很好,而且比 LINQ 更快。为什么要改呢?
  • 这不是必需品。我正在学习 LINQ,并认为我可以使用 LINQ 完成此任务。但似乎 LINQ(顾名思义)是用于查询而不是更新。感谢 cmets。

标签: c# linq collections


【解决方案1】:

当我阅读 cmets 时,我意识到我想做的事情效率较低且毫无意义。 LINQ 用于查询和创建新集合,而不是更新集合。我遇到的一个可能的解决方案是这个

list.Select(c => { if (c.val < 0 ) c.val= 0; return c;}).ToList();

但我最初的 foreach 解决方案比这更有效。所以不要犯同样的错误,让事情复杂化。

【讨论】:

    【解决方案2】:

    你可以试试这个,因为并行性

    更快
    Parallel.ForEach(list, item =>
    {
        item.val = item.val < 0 ? 0 : item.val;
    });
    

    C# 中的Parallel ForEach 提供标准顺序 Foreach 循环的并行版本。在标准的 Foreach 循环中,每次迭代都会处理集合中的单个项目,并且只会一个接一个地处理所有项目。但是,Parallel Foreach 方法在不同的处理器或处理器内核上同时执行多个迭代。这可能会打开同步问题的可能性。因此,循环非常适合每次迭代独立于其他迭代的过程

    更多详情 - LINK

    【讨论】:

    • 会调查这个
    【解决方案3】:

    循环'for'比'foreach'快,所以你可以使用这个

              for (int i = 0; i < list.Count; i++)
                {
                    if(list[i].val <= 0)
                    {
                        list[i].val = 0;
                    }
                }
    

    【讨论】:

    • 它应该是i &lt; list.Count而不是更大。也不是 OP 说它是一个列表,所以你应该使用 Count 而不是 Length
    猜你喜欢
    • 2014-01-29
    • 2020-04-05
    • 1970-01-01
    • 2018-01-05
    • 2020-05-14
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多