LINQ:如何通过对每个元素执行计算来转换列表

3

我有一个类

Class MyObject
{
    decimal v1;
    decimal dv1;
    decimal v2;
    decimal dv2;
}

并且一个

List<MyObject> ...

我需要通过将dv1加到v1和将dv2加到v2来处理列表中的每个元素。类似于以下伪代码:
myList.Transform(o=>o.v1+=o.dv1, o.v2+=o.dv2)

我的伪代码语法明显无法正常运行,我该怎么做?

谢谢你。


1
这不是你应该使用LINQ做的事情。LINQ用于执行查询(=只读)。你想要改变状态。你可以使用一个简单的foreach语句来实现。 - Steven
4个回答

7
LINQ旨在从给定的枚举中获取子集或创建一个由列表中新类型组成的枚举。
要操作给定列表,LINQ不是操作给定列表的正确工具。为了完成您的任务,您应该采用foreach循环,例如:
foreach(var item in objects)
{
    item.v1 += obj.dv1;
}

您可以通过类似以下方式预先选择您想要的对象元素:
foreach(var item in object.Where(o => o.v1 % 2 == 0))

像其他人提到的那样,您可以自己实现一个ForEach()扩展方法,但它不存在的原因是有原因的:
请查看Eric博客文章


5
您可以使用列表的 ForEach 方法:
List<MyObject> objects = new List<MyObject>();

// Populate list.

objects.ForEach(obj => {
  obj.v1 += obj.dv1;
  obj.v2 += obj.dv2;
});

3
LINQ提供了{{link1:'选择'进行转换}}。
list.Select( obj => new MyObject(obj.v1 + obj.dv1, obj.dv1, obj.v2 + obj.dv2, obj.dv2))

但请注意,返回值是一个新列表;原始列表的元素不会被修改。无副作用/状态变化。 如果这是您的目标,请选择select;否则,请像其他人建议的那样使用for / for-each。


0

我认为这不是linq的典型任务,但如果您想要,您可以这样做:

List<MyClass> objects = GetMyClasses();
Func<Action<MyClas>s, bool> do = (action) => { action(); return true; }
(from o in objects
 where do( o, b=> { b.v1 += b.dv1; b.v2 += b.dv2; } )
 select o).ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接