有没有办法做到这一点,在List .ForEach()语句中分配一个值?

我有这个:

var lineArray = line.Split(';'); lineArray.ToList().ForEach(x => { if (x == "(null)") x = "NULL"; else x = string.Format("'{0}'", x); }); 

这样运行正常,但似乎没有改变lineArray的元素。 我想过将ForEach的结果ForEach var但它返回void。

有任何想法吗 ?

编辑:我认为这是因为ToList()返回值没有在任何地方分配…

 var lineArray = line.Split(';') .Select(x=>x == "(null)" ? "NULL" : string.Format("'{0}'", x)) .ToArray(); 

你试图使用带有lambda表达式的List.ForEach(Action action) (T是这里的字符串)

如果lambda表达式被命名方法替换,则事实certificate只修改了方法参数,但是更改没有反映在调用方,因为x不是ref参数

 private void Replace(string x) { if (x == "(null)") x = "NULL"; else x = string.Format("'{0}'", x); } var list = lineArray.ToList(); list.ForEach(Replace); // check list here and make sure that there are no changes 

如果T是引用类型并且操作修改了某些属性而不是引用本身,则ForEach可以工作

不要像那样使用ForEach – 使用for循环。

 for (int i = 0; i < lineArray.Length; i++) { if (lineArray[i] == "(null)") lineArray[i] = "NULL"; else lineArray[i] = string.Format("'{0}'", lineArray[i]); } 

您可以从原始列表构建一个新列表:

 var newList = lineArray.Select(x => x == "(null)" ? "NULL" : string.Format("'{0}'", x)); 

我认为这个小小的改变会起作用

  var lineArray = line.Split(';').ToList(); lineArray.ForEach(x => { if (x == "(null)") x = "NULL"; else x = string.Format("'{0}'", x); }); 

下面是一个工作示例

 string line = "a;b;null;c;"; var lineArray = line.Split(';').ToList(); lineArray.ForEach(x => { if (x == "(null)") x = "NULL"; else x = string.Format("'{0}'", x); }); 

结果: 在此处输入图像描述

如果只需从列表中删除(null)值,则无需循环使用removeAll

  lineArray.RemoveAll(a=>a.Equals("(null)")); 

以下工作示例

在此处输入图像描述