C# 如何使用LINQ为对象集合中每个对象的特定属性设置值

C# 如何使用LINQ为对象集合中每个对象的特定属性设置值,c#,linq,C#,Linq,我有类帐户,它有属性: publci decimal Amount { get; set; } 我有列表和这里,但这两个问题都至少有好几年的历史了。第一个问题对我来说更有意义,因为我尊重回答这个问题的人,但同时在使用Jon Skeet所指出的SetValue时也有一些顾虑,尽管SetValue是我在实践中想要做的。第二个答案“听起来”更具说服力,但出于某种原因,我怀疑使用ForEach,因此我想知道在我的情况下,我应该采取什么方法来更改数量值?LINQ通常用于选择数据,而不是批量更新。使用fo

我有类
帐户
,它有属性:

publci decimal Amount { get; set; }

我有
列表和这里,但这两个问题都至少有好几年的历史了。第一个问题对我来说更有意义,因为我尊重回答这个问题的人,但同时在使用Jon Skeet所指出的
SetValue
时也有一些顾虑,尽管
SetValue
是我在实践中想要做的。第二个答案“听起来”更具说服力,但出于某种原因,我怀疑使用
ForEach
,因此我想知道在我的情况下,我应该采取什么方法来更改
数量
值?

LINQ通常用于选择数据,而不是批量更新。使用foreach迭代器循环并更新对象,甚至更新方法。

您可以使用,它们有
foreach
操作
IEnumerable
(Ix是的“镜像”),因此您可以避免调用
ToList
方法(并避免不必要的分配)

类帐户
{
公共十进制数{get;set;}
}
公共静态void Main(字符串[]a)
{
IEnumerable集合=新帐户[]
{
新帐户(){Amount=4},
新帐户(){Amount=5},
新帐户(){Amount=6},
新帐户(){Amount=7},
};
Parallel.ForEach(集合,n=>
{
n、 金额=0;
});
}

为什么需要使用LINQ?常规的、枯燥的
foreach
循环有什么问题?有什么比
foreach(账户中的var acc)acc更具可读性?acc金额=0?林[Q]是一个用来查询某些东西而不是改变它的工具。@JeanHominal…因为…就像…它很无聊?每个人都知道linq不仅会看起来更好,而且会帮助你在生活中取得成功…@TimSchmelter事实上你是对的。但是,正如Noctis所说,LINQ是现代的,每个人都使用LINQ,当你的老板(或者至少是我的老板)看到LINQ完成了所有事情时,他会很高兴。。。是的,即使是主观的还是有理由使用LINQ@Leron:如果您向LINQ查询提供副作用,那么没有老板会高兴。With:“这样做违反了所有其他序列运算符所基于的函数编程原则。显然,调用此方法的唯一目的是产生副作用。表达式的目的是计算值,而不是产生副作用。”查询是一个表达式。我也同意:“我们制造混乱,我们让人们更难读懂彼此的代码”我为什么要用
以外的东西来交换呢<代码>列表。ForEach
在任何情况下都不会更好。@TimSchmelter显然没有必要。只是有些人更喜欢方法链。Ix也不仅仅是ForEach的
ForEach
,它只是其中的一小部分。我认为继续一个开始修改某些内容的查询是不好的做法。它的副作用在LINQ中是不需要的。@TimSchmelter
ForEach
只能是链中的最后一个方法,所以虽然它不是纯函数LINQ,但实际上并不会使任何事情复杂化。这是关于个人偏好:函数纯度与“好”代码。请看我在问题下面的评论,这是根据E.Lippert关于函数编程原理的话。它的可读性很差。不是因为它很复杂,而是因为您必须始终记住使用此方法是否安全。实际上,它没有给
foreach
添加任何内容,但是它的可读性成本很高,您无法再调试它。我还没有看到使用
列表的具体原因。foreach
超过
foreach
构造。我同意;然而,这是一种选择,对于喜欢LINQ的人来说,这比foreach更像LINQ。我个人坚持使用旧的foreach迭代器。这是一个非常糟糕的建议。不仅它的性能要差得多,而且您还建议使用一种方法,而不解释(可能理解)它是如何工作的。
accounts.Where(a => a.Amount > 10).ForEach(a => a.Amount = 0);
    class Account
    {
        public decimal Amount { get; set; }
    }

    public static void Main(string[] a)
    {
        IEnumerable<Account> collection = new Account[] 
        {
            new Account() {Amount = 4},
            new Account() {Amount = 5},
            new Account() {Amount = 6},
            new Account() {Amount = 7},
        };

        Parallel.ForEach(collection, n =>
            {
                n.Amount = 0;
            });
    }