如何使用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);