如何使用foreach修改通用列表中的项目?

Ant*_*ony 8 c# foreach generic-list

我有以下通用列表,其中填充了一个字符串列表:

List<string> mylist =new List<string>();  
myList.add("string1");  
myList.add("string2");
Run Code Online (Sandbox Code Playgroud)

假设我想在每个字符串的末尾添加"test",我该如何以简单的方式完成?直觉上,我试过这个编译好了:

myList.ForEach(s => s = s + "test");  
Run Code Online (Sandbox Code Playgroud)

但是,如果我再查看列表的内容,则没有任何改变.我想我可以使用for循环迭代List但我正在寻找一些非常简单的东西,使用ForEach看起来非常整洁....但似乎不起作用.有任何想法吗?

jer*_*jvl 14

问题是Action你指定的是在列表的元素上执行,但结果不会放回任何地方......你s只是一个局部变量.

就地更改列表可能需要实际foreach,但如果您乐意将新列表作为结果,您可以尝试:

list = list.ConvertAll(s => s + "test");
Run Code Online (Sandbox Code Playgroud)

不太一样......但是尽可能接近......


Meh*_*ari 9

除非列表类型是可变引用类型,否则不可能这样做(在这种情况下,您仍然无法更改列表中的实际引用,而是更改对象本身).

原因是List<T>.ForEach调用Action<T>具有签名的委托:

delegate void Action<T>(T obj);
Run Code Online (Sandbox Code Playgroud)

在这里,参数是通过值传递的(它不是ref).与任何方法一样,当按值调用时,您无法更改输入参数:

代码基本上等同于:

void anonymous_method(string s) {
    s = s + "test";  // no way to change the original `s` inside this method.
}

list.ForEach(anonymous_method);
Run Code Online (Sandbox Code Playgroud)