如何使用LINQ ForEach更改List
我有一个List myInts
,想要将所有数字乘以10.我想使用linq(不是foreach循环)。我试过这个,但没有发生任何事情:
List myInts = new List() { 1, 2, 3 }; myInts .ForEach(act => act=act*10);
在.ForEach(...)
部分我需要注意什么? 是的,如果有可能,我想使用ForEach。
可能它很简单,但我无法看到它,我很抱歉。 谢谢你们!
这将创建一个新的List实例。
myInts = myInts.Select(p=>p*10).ToList();
另一个更简单的解决方案:
list = list.ConvertAll(i => i * 10);
“没有任何反应”,因为重新分配给局部变量( act
)对调用者没有影响 ( ForEach
) – C#是Call By Value (ref / out参数除外)。
要修改列表,只需在索引上使用标准for-each(我发现可读和副作用意图的前期):
var myInts = new List() { 1, 2, 3 }; for (var i = 0; i < myInts.Count; i++) { myInts[i] = myInts[i] * 10; }
要执行操作并创建新的列表/序列(可以重新分配给同一个变量),请参阅IEnumerable.Select
这是一个映射转换。
从MSDN文档:
Modifying the underlying collection in the body of the Action delegate is not supported and causes undefined behavior.
因此,您需要将exisistin列表投影到新的列表中,或者如果必须“就地”修改列表,则需要使用for循环
问候
发生的事情是你得到了一个int值的副本到lambda,这样你就无法改变’external’int。
如何投射新名单?
List myInts = new List () { 1, 2, 3 }; myInts = myInts.Select(act => act*10).ToList();
使用.Select
或.ConvertAll
是很好的解决方案。
但我的意图是让“ ForEach
”返回一个改动清单。 我发现,通过msdn文档,这不可能,因为ForEach是一个void
类型,没有返回类型。
如果我的列表中有对象而不是整数,则此类操作有效。 然后我就可以使用“void”方法来更改对象的属性。
你的意思是这样的吗?
List _tempList = new List (); myInts.ToList().ForEach(x => _tempList.Add(x * 10));
试试这个:
Enumerable.Range(0, myInts.Count).ToList().ForEach(i => myInts[i] = myInts[i] * 10);